logo

Преместете скалата за претегляне алтернативно при дадени ограничения

Дадена е скала за претегляне и масив от различни положителни тегла, където имаме безкраен запас от всяко тегло. Нашата задача е да поставим тежести върху лявата и дясната част на везната една по една по такъв начин, че плочите да се преместят към тази страна, където е поставена тежестта, т.е. всеки път, когато чашите на везната се преместят на друга страна.

  • Дадени са ни други цели числа „стъпки“, които са ни необходими, за да изпълним тази операция.
  • Друго ограничение е, че не можем да поставим едно и също тегло последователно, т.е. ако се вземе теглото 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 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 

Изход:

2 3 2 3 5 6 5 3 2 3

 

Създаване на тест