Check if item can be measured using a scale and some weights

Given some weights of masses a0, a1, a2, …, a100, a being an integer, and a weighing scale where weights can be put on both the sides of the scale. Check whether a particular item of weight W can be measured using these weights and scale.

Constraints: 2 ≤ W ≤ 109

Examples:

Input : a = 2, W = 5
Output : YES
Explanation : Weights of masses (20 = 1) and (22 = 4) can be placed on one side of the scale and the item can be placed on other side, i.e. 1 + 4 = 5

Input : a = 4, W = 11
Output : YES
Explanation : Weights of masses (40 = 1) and (41 = 4) and the item can be placed on one side and a weight of mass (42 = 16) can be placed on the other side, i.e. 1 + 4 + 11 = 16

Input : a = 4, W = 7
Output : NO

Approach:

  • Firstly, it can be carefully observed that for a = 2 or a = 3, the answer always exists.
  • Maintain an array containing weights of masses and only include that weights that are less than 109
  • Now, the problem can be solved recursively by either including current weight to the side containing
    item or including current weight to the opposite side containing item or by not using that weight at all.
  • Below is the implementation of above approach .

    C++

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // CPP Program to check whether an item
    // can be measured using some weight and
    // a weighing scale.
    #include <bits/stdc++.h>
    using namespace std;
      
    // Variable to denote that answer has
    // been found
    int found = 0;
      
    void solve(int idx, int itemWt, int wts[],
               int N)
    {
        if (found)
            return;
      
        // Item has been measured
        if (itemWt == 0) {
            found = 1;
            return;
        }
      
        // If the index of current weight
        // is greater than totalWts
        if (idx > N)
            return;
      
        // Current weight is not included
        // on either side
        solve(idx + 1, itemWt, wts, N);
      
        // Current weight is included on the
        // side containing item
        solve(idx + 1, itemWt + wts[idx], wts,
              N);
      
        // Current weight is included on the
        // side opposite to the side
        // containing item
        solve(idx + 1, itemWt - wts[idx], wts,
              N);
    }
      
    // This function computes the required array
    // of weights using a
    bool checkItem(int a, int W)
    {
        // If the a is 2 or 3, answer always
        // exists
        if (a == 2 || a == 3)
            return 1;
      
        int wts[100]; // weights array
        int totalWts = 0; // feasible weights
        wts[0] = 1;
        for (int i = 1;; i++) {
            wts[i] = wts[i - 1] * a;
            totalWts++;
      
            // if the current weight
            // becomes greater than 1e9
            // break from the loop
            if (wts[i] > 1e9)
                break;
        }
        solve(0, W, wts, totalWts);
        if (found)
            return 1;
      
        // Item can't be measured
        return 0;
    }
      
    // Driver Code to test above functions
    int main()
    {
        int a = 2, W = 5;
        if (checkItem(a, W))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
      
        a = 4, W = 11, found = 0;
        if (checkItem(a, W))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
      
        a = 4, W = 7, found = 0;
        if (checkItem(a, W))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
        return 0;
    }

    chevron_right

    
    

    Java

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Java Program to check whether an item
    // can be measured using some weight and
    // a weighing scale.
      
    class GFG {
      
    // Variable to denote that answer has
    // been found
        static int found = 0;
      
        static void solve(int idx, int itemWt, int wts[], int N) {
            if (found == 1) {
                return;
            }
      
            // Item has been measured
            if (itemWt == 0) {
                found = 1;
                return;
            }
      
            // If the index of current weight
            // is greater than totalWts
            if (idx > N) {
                return;
            }
      
            // Current weight is not included
            // on either side
            solve(idx + 1, itemWt, wts, N);
      
            // Current weight is included on the
            // side containing item
            solve(idx + 1, itemWt + wts[idx], wts,
                    N);
      
            // Current weight is included on the
            // side opposite to the side
            // containing item
            solve(idx + 1, itemWt - wts[idx], wts,
                    N);
        }
      
    // This function computes the required array
    // of weights using a
        static boolean checkItem(int a, int W) {
            // If the a is 2 or 3, answer always
            // exists
            if (a == 2 || a == 3) {
                return true;
            }
      
            int wts[] = new int[100]; // weights array
            int totalWts = 0; // feasible weights
            wts[0] = 1;
            for (int i = 1;; i++) {
                wts[i] = wts[i - 1] * a;
                totalWts++;
      
                // if the current weight
                // becomes greater than 1e9
                // break from the loop
                if (wts[i] > 1e9) {
                    break;
                }
            }
            solve(0, W, wts, totalWts);
            if (found == 1) {
                return true;
            }
      
            // Item can't be measured
            return false;
        }
      
    // Driver Code to test above functions
        public static void main(String[] args) {
      
            int a = 2, W = 5;
            if (checkItem(a, W)) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
      
            a = 4; W = 11;found = 0;
            if (checkItem(a, W)) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
      
            a = 4; W = 7; found = 0;
            if (checkItem(a, W)) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }
      
    //this code contributed by Rajput-Ji

    chevron_right

    
    

    C#

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

          
    // C# Program to check whether an item
    // can be measured using some weight and
    // a weighing scale.
    using System; 
    public class GFG {
       
    // Variable to denote that answer has
    // been found
        static int found = 0;
       
        static void solve(int idx, int itemWt, int []wts, int N) {
            if (found == 1) {
                return;
            }
       
            // Item has been measured
            if (itemWt == 0) {
                found = 1;
                return;
            }
       
            // If the index of current weight
            // is greater than totalWts
            if (idx > N) {
                return;
            }
       
            // Current weight is not included
            // on either side
            solve(idx + 1, itemWt, wts, N);
       
            // Current weight is included on the
            // side containing item
            solve(idx + 1, itemWt + wts[idx], wts,
                    N);
       
            // Current weight is included on the
            // side opposite to the side
            // containing item
            solve(idx + 1, itemWt - wts[idx], wts,
                    N);
        }
       
    // This function computes the required array
    // of weights using a
        static bool checkItem(int a, int W) {
            // If the a is 2 or 3, answer always
            // exists
            if (a == 2 || a == 3) {
                return true;
            }
       
            int []wts = new int[100]; // weights array
            int totalWts = 0; // feasible weights
            wts[0] = 1;
            for (int i = 1;; i++) {
                wts[i] = wts[i - 1] * a;
                totalWts++;
       
                // if the current weight
                // becomes greater than 1e9
                // break from the loop
                if (wts[i] > 1e9) {
                    break;
                }
            }
            solve(0, W, wts, totalWts);
            if (found == 1) {
                return true;
            }
       
            // Item can't be measured
            return false;
        }
       
    // Driver Code to test above functions
        public static void Main() {
       
            int a = 2, W = 5;
            if (checkItem(a, W)) {
                Console.WriteLine("YES");
            } else {
                Console.WriteLine("NO");
            }
       
            a = 4; W = 11;found = 0;
            if (checkItem(a, W)) {
                Console.WriteLine("YES");
            } else {
                Console.WriteLine("NO");
            }
       
            a = 4; W = 7; found = 0;
            if (checkItem(a, W)) {
                Console.WriteLine("YES");
            } else {
                Console.WriteLine("NO");
            }
        }
    }
       
    //this code contributed by Rajput-Ji

    chevron_right

    
    

    Output:

    YES
    YES
    NO
    

    Time Complexity: O(3N), where N cannot be more than 20 since 420 is greater than 109



    My Personal Notes arrow_drop_up

    Check out this Author's contributed articles.

    If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

    Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



    Improved By : Rajput-Ji