📜  在给定的约束条件下交替移动加权秤

📅  最后修改于: 2022-05-13 01:57:54.128000             🧑  作者: Mango

在给定的约束条件下交替移动加权秤

给定一个权重尺度和一组不同的正权重,其中每个权重的供应量都是无限的。我们的任务是将砝码一个一个地放在秤的左右秤盘上,使秤盘移动到放置砝码的那一侧,即每次秤盘移动到另一侧。

  • 我们得到另一个整数“步数”,即我们需要执行此操作的时间。
  • 另一个限制是我们不能连续放置相同的重量,即如果重量 w 被取走,那么在下一步将重量放在对面的平底锅上时,我们不能再取 w。

    例子:

    Let weight array is [7, 11]  and steps = 3 
    then 7, 11, 7 is the sequence in which 
    weights should be kept in order to move
    scale alternatively.
    
    Let another weight array is [2, 3, 5, 6] 
    and steps = 10 then, 3, 2, 3, 5, 6, 5, 3, 
    2, 3 is the sequence in which weights should
    be kept in order to move scale alternatively.
    

    这个问题可以通过在尺度状态之间做 DFS 来解决。

    1. 我们在各种 DFS 状态之间进行遍历以获得解决方案,其中每个 DFS 状态将对应于左右平移之间的实际差值和当前步数。
    2. 我们不存储两个平底锅的重量,而是只存储差值残差值,并且每次选择的重量值都应该大于这个差值,并且不应该等于之前选择的重量值。
    3. 如果是,那么我们用新的差值和多一步递归调用 DFS 方法。

    请参阅下面的代码以更好地理解,

    C++
    // C++ program to print weights for alternating
    // the weighting scale
    #include 
    using namespace std;
      
    // DFS method to traverse among states of weighting scales
    bool dfs(int residue, int curStep, int wt[], int arr[],
             int N, int steps)
    {
        // If we reach to more than required steps,
        // return true
        if (curStep > steps)
            return true;
      
        // Try all possible weights and choose one which
        // returns 1 afterwards
        for (int i = 0; i < N; i++)
        {
            /* Try this weight only if it is greater than
               current residueand not same as previous chosen
               weight */
            if (arr[i] > residue && arr[i] != wt[curStep - 1])
            {
                // assign this weight to array and recur for
                // next state
                wt[curStep] = arr[i];
                if (dfs(arr[i] - residue, curStep + 1, wt,
                        arr, N, steps))
                    return true;
            }
        }
      
        //    if any weight is not possible, return false
        return false;
    }
      
    // method prints weights for alternating scale and if
    // not possible prints 'not possible'
    void printWeightsOnScale(int arr[], int N, int steps)
    {
        int wt[steps];
      
        // call dfs with current residue as 0 and current
        // steps as 0
        if (dfs(0, 0, wt, arr, N, steps))
        {
            for (int i = 0; i < steps; i++)
                cout << wt[i] << " ";
            cout << endl;
        }
        else
            cout << "Not possible\n";
    }
      
    //    Driver code to test above methods
    int main()
    {
        int arr[] = {2, 3, 5, 6};
        int N = sizeof(arr) / sizeof(int);
      
        int steps = 10;
        printWeightsOnScale(arr, N, steps);
        return 0;
    }


    Java
    // Java program to print weights for alternating 
    // the weighting scale
    class GFG 
    {
      
        // DFS method to traverse among 
        // states of weighting scales
        static boolean dfs(int residue, int curStep, 
                           int[] wt, int[] arr,
                           int N, int steps) 
        {
      
            // If we reach to more than required steps,
            // return true
            if (curStep >= steps)
                return true;
      
            // Try all possible weights and 
            // choose one which returns 1 afterwards
            for (int i = 0; i < N; i++) 
            {
      
                /*
                * Try this weight only if it is 
                * greater than current residue 
                * and not same as previous chosen weight
                */
                if (curStep - 1 < 0 || 
                   (arr[i] > residue &&
                    arr[i] != wt[curStep - 1]))
                {
      
                    // assign this weight to array and 
                    // recur for next state
                    wt[curStep] = arr[i];
                    if (dfs(arr[i] - residue, curStep + 1,
                                       wt, arr, N, steps))
                        return true;
                }
            }
      
            // if any weight is not possible,
            // return false
            return false;
        }
      
        // method prints weights for alternating scale 
        // and if not possible prints 'not possible'
        static void printWeightOnScale(int[] arr, 
                                       int N, int steps) 
        {
            int[] wt = new int[steps];
      
            // call dfs with current residue as 0 
            // and current steps as 0
            if (dfs(0, 0, wt, arr, N, steps)) 
            {
                for (int i = 0; i < steps; i++)
                    System.out.print(wt[i] + " ");
                System.out.println();
            } 
            else
                System.out.println("Not Possible");
        }
      
        // Driver Code
        public static void main(String[] args)
        {
            int[] arr = { 2, 3, 5, 6 };
            int N = arr.length;
            int steps = 10;
            printWeightOnScale(arr, N, steps);
        }
    }
      
    // This code is contributed by
    // sanjeev2552


    Python3
    # Python3 program to print weights for  
    # alternating the weighting scale 
      
    # DFS method to traverse among states 
    # of weighting scales 
    def dfs(residue, curStep, wt, arr, N, steps):
          
        # If we reach to more than required 
        # steps, return true 
        if (curStep >= steps): 
            return True
      
        # Try all possible weights and choose 
        # one which returns 1 afterwards
        for i in range(N):
              
            # Try this weight only if it is greater 
            # than current residueand not same as 
            # previous chosen weight 
            if (arr[i] > residue and 
                arr[i] != wt[curStep - 1]):
                  
                # assign this weight to array and 
                # recur for next state 
                wt[curStep] = arr[i] 
                if (dfs(arr[i] - residue, curStep + 1,
                                  wt, arr, N, steps)): 
                    return True
      
        # if any weight is not possible,
        # return false 
        return False
      
    # method prints weights for alternating scale 
    # and if not possible prints 'not possible' 
    def printWeightsOnScale(arr, N, steps):
        wt = [0] * (steps) 
      
        # call dfs with current residue as 0 
        # and current steps as 0 
        if (dfs(0, 0, wt, arr, N, steps)):
            for i in range(steps):
                print(wt[i], end = " ")
        else:
            print("Not possible")
      
    # Driver Code
    if __name__ == '__main__':
      
        arr = [2, 3, 5, 6] 
        N = len(arr)
      
        steps = 10
        printWeightsOnScale(arr, N, steps)
      
    # This code is contributed by PranchalK



    输出:
    2 3 2 3 5 6 5 3 2 3