1. 程式人生 > 其它 >b_dd_湊硬幣進階-最多使用k個(完全揹包+算組合數)

b_dd_湊硬幣進階-最多使用k個(完全揹包+算組合數)

1、2、5 三種硬幣,使用 k 個,要湊成 target 共有幾種方式?

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

// 1、2、5 三種硬幣,只使用 k 個湊成 target 共有幾種方式?
// f[i][j][k] 表示用前i種硬幣,使用j個,湊成金額k的方案數
int solve(vector<int>& coins, int tg, int K) {
    int n = coins.size();
    int f[n+1][K+1][tg+1];
    memset(f, 0, sizeof f);
    for (int i = 0; i <= n; i++)
        f[i][0][0] = 1;
    
    for (int i = 1; i <= n; i++)
    for (int j = 1; j <= K; j++)
    for (int k = 0; k <= tg; k++) {
        f[i][j][k] = f[i-1][j][k]; //這個轉移沒想明白
        if (k >= coins[i-1])
            // f[i][j][k] = f[i-1][j-1][k-coins[i-1]] + 1; //這樣寫是不對的
            f[i][j][k] += f[i][j-1][k-coins[i-1]]; //這樣寫是不對的
    }
    return f[n][K][tg];
}

int main() {
    vector<int> coins(3);
    coins[0] = 1, coins[1] = 3, coins[2] = 5;
    int target = 10, k = 2;
    cout << solve(coins, target, k);
}

https://leetcode-cn.com/circle/discuss/fMOTe9/