Find optimal weights which can be used to weigh all the weights in the range [1, X]

• Last Updated : 07 Jun, 2021

Given an integer X, the task is to find an optimal set of weights {w1, w2, w3, …, wn} such that we can weigh/determine all the weights from 1 to X using a two-sided weighing balance pan. Note that all the weights must be unique and n should be as minimum as possible.
Examples:

Input: X = 7
Output: 1 3 9

Input: X = 20
Output: 1 3 9 27

Approach:

1. One optimal approach is to use weights which are powers of 3 i.e. {1, 3, 9, 27, 81, 243, …}
2. It can be proved through induction that using {1, 3, 9, 27, 81, …, pow(3, n)}, we can balance all the weights from 1 to (pow(3, n + 1) – 1) / 2.
3. So, find the values of n such that all the values from 1 to X can be balanced and print the results.

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach#include using namespace std; // Function to find the optimal weightsvoid findWeights(int X){    int sum = 0;     // Number of weights required    int power = 0;     // Finding the value of required powers of 3    while (sum < X) {        sum = pow(3, power + 1) - 1;        sum /= 2;        power++;    }     // Optimal Weights are powers of 3    int ans = 1;    for (int i = 1; i <= power; i++) {        cout << ans << " ";        ans = ans * 3;    }} // Driver codeint main(){    int X = 2;     findWeights(X);     return 0;}

Java

 // Java implementation of the approachimport java.util.*; public class GFG{         // Function to find the optimal weights    static void findWeights(int X)    {        int sum = 0;         // Number of weights required        int power = 0;        int number = 3;                 // Finding the value of required powers of 3        while (sum < X)        {            sum = number - 1;            sum /= 2;            power++;            number *= 3;        }         // Optimal Weights are powers of 3        int ans = 1;        for (int i = 1; i <= power; i++)        {            System.out.print(ans + " ");            ans = ans * 3;        }    }          // Driver code    public static void main (String[] args)    {        int X = 2;         findWeights(X);     }} // This code is contributed by Sam007.

Python3

 # Python3 implementation of the approach # Function to find the optimal weightsdef findWeights(X):     sum = 0     # Number of weights required    power = 0     # Finding the value of required powers of 3    while (sum < X):        sum = pow(3, power + 1) - 1        sum //= 2        power += 1     # Optimal Weights are powers of 3    ans = 1    for i in range(1, power + 1):        print(ans, end = " ")        ans = ans * 3 # Driver codeX = 2 findWeights(X) # This code is contributed by Mohit Kumar

C#

 // C# implementation of the approachusing System; class GFG{         // Function to find the optimal weights    static void findWeights(int X)    {        int sum = 0;         // Number of weights required        int power = 0;        int number = 3;                 // Finding the value of required powers of 3        while (sum < X)        {            sum = number - 1;            sum /= 2;            power++;            number *= 3;        }         // Optimal Weights are powers of 3        int ans = 1;        for (int i = 1; i <= power; i++)        {            Console.Write(ans + " ");            ans = ans * 3;        }    }     // Driver code    static public void Main ()    {        int X = 2;        findWeights(X);    }} // This code is contributed by ajit.

Javascript


Output:
1 3

My Personal Notes arrow_drop_up