logo

Spostare la scala di ponderazione in modo alternato in base a determinati vincoli

Data una scala di ponderazione e una serie di diversi pesi positivi in ​​cui abbiamo una fornitura infinita di ciascun peso. Il nostro compito è posizionare i pesi sui piatti della bilancia sinistro e destro uno per uno in modo tale che i piatti si spostino sul lato in cui viene posizionato il peso, ovvero ogni volta che i piatti della bilancia si spostano su lati alterni.

  • Ci viene dato un altro numero intero di "passi" necessari per eseguire questa operazione.
  • Un altro vincolo è che non possiamo mettere lo stesso peso consecutivamente, cioè se viene preso il peso w, nel passaggio successivo mentre si mette il peso sul piatto opposto non possiamo prendere w di nuovo.

Esempi:

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.

Questo problema può essere risolto facendo DFS tra stati di scala.



  1. Attraversiamo i vari stati DFS per la soluzione in cui ciascuno stato DFS corrisponderà al valore di differenza effettiva tra le panoramiche sinistra e destra e il conteggio dei passi corrente.
  2. Invece di memorizzare i pesi di entrambi i piatti, memorizziamo semplicemente il valore residuo della differenza e ogni volta il valore di peso scelto dovrebbe essere maggiore di questa differenza e non dovrebbe essere uguale al valore di peso scelto in precedenza.
  3. Se lo è, chiamiamo ricorsivamente il metodo DFS con un nuovo valore di differenza e un ulteriore passaggio.

Si prega di vedere il codice seguente per una migliore comprensione 

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 possiblen'; } // 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 
C#
// C# program to print weights for alternating  // the weighting scale using System; namespace GFG {  class Program  {  // DFS method to traverse among states of weighting scales  static 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 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++)  Console.Write(wt[i] + ' ');  Console.WriteLine();  }   else  Console.WriteLine('Not Possible');  }  static void Main(string[] args)  {  int[] arr = { 2 3 5 6 };  int N = arr.Length;  int steps = 10;  printWeightOnScale(arr N steps);  }  } } 
JavaScript
function 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 (let i = 0; i < N; i++)   {    /* Try this weight only if it is greater than  current residue and 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; } function printWeightsOnScale(arr N steps) {  const wt = new Array(steps);  // call dfs with current residue as 0 and current  // steps as 0  if (dfs(0 1 wt arr N steps)) {  for (let i = 1; i <= steps; i++) {  process.stdout.write(`${wt[i]} `);  }  console.log();  } else {  console.log('Not possible');  } } const arr = [2 3 5 6]; const N = arr.length; const steps = 10; printWeightsOnScale(arr N steps); // This code is contributed by divyansh2212 

Produzione:

2 3 2 3 5 6 5 3 2 3

 

Crea quiz