DP

PHOTO EMBED

Wed Sep 20 2023 08:14:37 GMT+0000 (Coordinated Universal Time)

Saved by @jin_mori

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

const int N = 10010;
int dp[N];

int func(int amount, vector<int> &coins)
{
    if (amount == 0)
        return 0;
    if (dp[amount] != -1)
        return dp[amount];
    int ans = INT_MAX;
    for (int coin : coins)
    {
        if (amount - coin >= 0)
        {
            ans = min(ans, func(amount - coin, coins) + 1);
        }
    }
    return dp[amount] = ans;
} 

int coinChange(vector<int> &coins, int amount)
{
    int ans = func(amount, coins);
    return ans == INT_MAX ? -1 : ans;
}

int main()
{
    memset(dp, -1, sizeof(dp));
    vector<int> coins = {1, 2, 5};
    cout << coinChange(coins, 11);

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

const int N = 10010;
int dp[N][N];

int func(int ind, int amount, vector<int> &coins)
{
    if (amount == 0)
        return 1;
    if (ind < 0)
        return 0;
    if (dp[ind][amount] != -1)
        return dp[ind][amount];
    int way = 0;
    for (int coin_amount = 0; coin_amount <= amount; coin_amount += coins[ind])
    {
        way += func(ind - 1, amount - coin_amount, coins);
    }
    return dp[ind][amount] = way;
}

int coinChange(vector<int> &coins, int amount)
{
    memset(dp, -1, sizeof(dp));
    return func(coins.size() - 1, amount, coins);
}

int main()
{
    vector<int> coins = {1, 2, 5};
    cout << coinChange(coins, 5);

    return 0;
}
//////////////////////////
#include <bits/stdc++.h>
using namespace std;
int coin[1000], dp[1000][1000];
int coin_change(int n, int sum, int k)
{
    if (sum < 0)
        return 0;
    if (sum == 0 && k == 0)
        return 1;
    if (n == -1)
        return 0;
    if (dp[n][sum] != -1)
        return dp[n][sum];
    return dp[n][sum] = (coin_change(n - 1, sum - coin[n - 1], k - 1)) || (coin_change(n - 1, sum, k));
}
int main()
{
    int n, k, sum;
    cin >> n >> k >> sum;
    for (int i = 0; i < n; i++)
        cin >> coin[i];
    memset(dp, -1, sizeof(dp));
    coin_change(n, sum, k);
    cout << (dp[n][sum] ? "YES" : "NO");
}
content_copyCOPY