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

• Last Updated : 31 May, 2022

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 weights``void` `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 code``int` `main()``{``    ``int` `X = 2;` `    ``findWeights(X);` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``import` `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 weights``def` `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 code``X ``=` `2` `findWeights(X)` `# This code is contributed by Mohit Kumar`

## C#

 `// C# implementation of the approach``using` `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`

Time Complexity: O(logn)

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up