uva 674 Coin Change (完全背包求方案数)

本文介绍了一道关于使用不同面值硬币组合成特定金额的问题,并通过完全背包问题的解决方案来解答此问题。利用动态规划的方法,通过C++代码实现了一个简单的程序来计算可能的组合数量。

题意:有5种硬币, 面值分别为1、5、10、25、50,现在给出金额,问可以用多少种方式组成该面值。
思路:前两 天刚看到背包九讲中关于如何求完全背包求方案数的知识,转眼就又忘了。

背包九讲:
对于一个给定了背包容量、物品费用、物品间相互关系(分组、依赖等) 的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得 到装满背包或将背包装至某一指定容量的方案总数。 对于这类改变问法的问题,一般只需将状态转移方程中的max改成sum即 可。例如若每件物品均是完全背包中的物品,转移方程即为
F[i,v] = sumF[i−1,v],F[i,v−Ci]
初始条件是F[0,0] = 1。
事实上,这样做可行的原因在于状态转移方程已经考察了所有可能的背包 组成方案。

这题就和这个描述特别像,将所求的面额看成背包体积,5种硬币看成5种物品,这不就是一个裸题。。。

#include   <cstdio>
#include <algorithm>
#include  <cstring>
using namespace std;
int dp[7500];//dp[i]表示面额为i时的交换方法数
int coin[] = {1, 5, 10, 25, 50};

int main() {
    dp[0] = 1;
    for(int i = 0; i < 5; i++) {
        for(int j = coin[i]; j <= 7500; j++) {
            dp[j] = dp[j] + dp[j - coin[i]];
        }
    }
    int n;
while(~scanf("%d",&n)) printf("%d\n",dp[n]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值