Untitled

                Never    
C++
       
#include <bits/stdc++.h>
using namespace std;
vector<int> coins;
int n;
int dp[1005][1005];
set<vector<int>> ways;
vector<int> cnt;
int count(int i, int v)
{
    if (v == 0)
    {
        ways.insert(cnt);
        return 1;
    }
    if (i <= 0 || v < 0)
    {
        return 0;
    }
    // if (dp[i][v] != -1)
    //     return dp[i][v];
    int exclude = count(i - 1, v);
    cnt.push_back(coins[i - 1]);
    int include = count(i, v - coins[i - 1]);
    cnt.pop_back();
    return dp[i][v] = include + exclude;
}

int minCoins(int v)
{
    for (int i = 0; i <= n; i++)
    {
        dp[i][0] = 0;
    }
    for (int i = 1; i <= v; i++)
    {
        dp[0][i] = INT_MAX;
    }

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= v; j++)
        {
            if (coins[i - 1] <= j)
            {
                dp[i][j] = min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1);
            }
            else
            {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }

    return dp[n][v];
}

int number_of_ways(vector<int> coins, int val)
{
    int n = coins.size();
    vector<vector<int>> A(n, vector<int>(val + 1, 0));
    for (int i = 0; i < n; i++)
        A[i][0] = 1;
    for (int i = 0; i < n; i++)
    {
        for (int j = 1; j <= val; j++)
        {
            if (i == 0)
            {
                if (j % coins[i] == 0)
                    A[i][j] = 1;
                else
                    A[i][j] = 0;
            }
            else
            {
                if (j < coins[i])
                    A[i][j] = A[i - 1][j];
                else
                    A[i][j] = A[i - 1][j] + A[i][j - coins[i]];
            }
        }
    }
    return A[n - 1][val];
}

int number_of_ways3(vector<int> coins, int val)
{
    int n = coins.size();
    vector<int> A(val + 1, 0);
    A[0] = 1;
    for (int i = 0; i < n; i++)
    {
        for (int j = 1; j <= val; j++)
        {
            if (j >= coins[i])
                A[j] += A[j - coins[i]];
        }
    }
    return A[val];
}

int main()
{
    int n;
    cin >> n;
    coins.resize(n);
    memset(dp, -1, sizeof(dp));
    for (int i = 0; i < n; i++)
        cin >> coins[i];
    int val;
    cin >> val;
    cout << count(n, val) << endl;
    for (auto i : ways)
    {
        for (auto j : i)
            cout << j << " ";
        cout << endl;
    }
    cout << minCoins(val) << endl;
    return 0;
}

Raw Text