0

The question is fairly simple. There is a set {2,4,6}. The expected answer is all possible permutations to get the number 6. So, the answer will be:-

{ 2,2,2} , {2,4} , {4,2} , {6}

What I've tried:-

I'm trying to approach this problem using the popular "coin change" question. But in coin change permutations are not there. Means {2,4} and {4,2} are regarded as same. Here's my code. It doesn't account permutations.

public static int NumberOfWays(int sum)
{
    int [][] memMatrix = new int [7][sum+1];
    for (int i = 2 ; i <= 6 ; i += 2)
    {
        for (int j = 0 ; j <= sum ; j += 2)
        {
            if (i == 2)
            {
                //using only 2 , there is only 1 way to get the sum
                memMatrix[i][j] = 1;
            }
            else if ( i > j)
            {
                //if total sum is less than the newly used denomination , then the number of ways will always remain same
                memMatrix[i][j] = memMatrix[i - 2][j];
            }
            else
            {
                //if this is the case then need to calculate without using the denomination + using the denomination
                memMatrix[i][j] = memMatrix[i - 2][j] + memMatrix[i][j - i];
            }
        }
    }
    for (int i = 2 ; i <= 6 ; i += 2)
    {
        for (int j = 2 ; j <= sum ; j += 2)
        {
            System.out.print(memMatrix[i][j]+" ");
        }
        System.out.print("\n");
    }

    return memMatrix[6][sum];
}

Here's the output that I get along with the matrix. How can I account permutations also?

1 1 1 
1 2 2 
1 2 3 
The number of ways to get 6 = 3

1 Answers1

0

I got the solution. It's pretty straightforward. The code is commented. It might require a little bit of tracing.

 #include <bits/stdc++.h>
 using namespace std;

  // Function to find the total number of ways to get change of N from
 // unlimited supply of coins in set S
int count(int S[], int n, int N)
{
// if total is 0, return 1
if (N == 0)
    return 1;

// return 0 if total become negative
if (N < 0)
    return 0;

// initialize total number of ways to 0
int res = 0;

// do for each coin
for (int i = 0; i < n; i++) 
{
    // recuse to see if total can be reached by including
    // current coin S[i]
    res += count(S, n, N - S[i]);
}

// return total number of ways
return res;
}

// main function
int main()
{
// n coins of given denominations
int S[] = { 1, 2, 3 };
int n = sizeof(S) / sizeof(S[0]);

// Total Change required
int N = 4;

cout << "Total number of ways to get desired change is "
        << count(S, n, N);

return 0;
}