首页 > 其他 > 详细

b_dd_凑硬币进阶-最多使用k个(完全背包+算组合数)

时间:2021-06-13 23:53:49      阅读:22      评论:0      收藏:0      [点我收藏+]

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/

b_dd_凑硬币进阶-最多使用k个(完全背包+算组合数)

原文:https://www.cnblogs.com/wdt1/p/14881065.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!