b_dd_湊硬幣進階-最多使用k個(完全揹包+算組合數)
阿新 • • 發佈:2021-06-13
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); }