Preview:
#include <bits/stdc++.h>

using namespace std;
const int N = 100;
int dp[N];
vector<vector<int>>combinations[N];

void findCombinations(int amount,vector<int>&coins,vector<int>currentCombination)
{
    if(amount==0)
    {
        combinations[amount].push_back(currentCombination);
        return;
    }
    for(int coin:coins)
    {
        if(amount-coin>=0)
        {
            currentCombination.push_back(coin);
            findCombinations(amount-coin,coins,currentCombination);
            currentCombination.pop_back();
        }
    }
}
void print_combinations(int amount)
{
    if(combinations[amount].empty())
    {
        cout<<"No combinations found"<<endl;
        return;
    }
    cout<<"Combinations:"<< endl;
    for(vector<int>combination:combinations[amount])
    {
        for(int i=0;i<combination.size();i++)
        {
            cout << combination[i];
            if(i<combination.size() - 1)
                cout<< " + ";
        }
        cout<<endl;
    }
}
int func(int amount, vector<int>&coins)
{
    if(amount==0)
        return 0;
    int ans = INT_MAX;
    if(dp[amount]!=-1)
        return dp[amount];
    for(int coin : coins)
    {
        if((amount - coin) >= 0)
        {
            ans = min(ans+0LL, func(amount-coin,coins)+1LL);
        }
    }
    return dp[amount]=ans;
}
int choose_coin(vector<int>&coins, int amount)
{
    //memset(dp,-1,sizeof(dp));
    int ans = func(amount,coins);
    return ans == INT_MAX?-1:ans;
}

int main()
{
    //memset(dp,-1,sizeof(dp));
    vector<int>coins={2,3,4,5,6,9,15};
    cout<<"Minimum coin = "<<choose_coin(coins,23);
    findCombinations(23,coins,{});
    print_combinations(23);
    //for(int i=0;i<sizeof(dp);i++)
    //{
    //    cout<<dp[i]<<" ";
    //}
    return 0;
}





downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter