UVaOJ-674 Coin Change (完全背包)
来源:互联网 发布:jsp登陆界面源码 编辑:程序博客网 时间:2024/06/01 19:09
题意:
有1,5,10,25,50五种硬币,给出一个金额,问有几种凑钱的方式。
思路:
递推;
首先将dp数组全部初始化为0, dp[0] = 1,dp[i]表示“面值i凑钱种数”;
for (i = 0; i < 5; i ++){ // 代表5种面值的硬币,当前选用前i种
for(j = 0; j < N - 100; j ++){ // j代表面值
。。。。。。 // 更新每个面值的凑钱种数
}
}
那个实例来说:
i = 1时,dp数组存放了只有1元和5元的硬币时,各个面值的钱的凑钱方式;
现在i = 2,我们要新加入一种面值为10的硬币;
dp[j] 是原先时只用1,5两种硬币凑出j元的方案数,再加上必须含有10元凑出j元的方案数,就是1,5,10三种硬币的凑出j元方案数!但如何求出新加入这种面值的硬币的凑钱种数呢?
先说状态转移方程 dp[j] = dp[j] + dp[j - coin[i]];
dp[j - coin[i]] 是1,5,10三种硬币凑出j - coin[i]元的方案数,当然这里面也含有只有1,5两种硬币的情况,可是注意这儿我们要凑出j元,还需要再加一个coin[i](即10元),而加上这个金额,方案数目是不变的,因此,dp[j - coin[i]]即是必须含有10元凑出j元的方案数了。
代码:
#include <stdio.h>#define N 8000int coin[5] = {1, 5, 10, 25, 50};int dp[N] = {1};int main(){int i, j, n;for (i = 0; i < 5; i ++){for(j = 0; j < N - 100; j ++)dp[j + coin[i]] += dp[j];}while (scanf("%d", &n) != EOF)printf("%d\n", dp[n]);return 0;}
- UVaOJ-674 Coin Change (完全背包)
- UVaOJ 674 - Coin Change
- uvaoj 674 - Coin Change
- UVaOJ 674 Coin Change
- Uva 674 Coin Change 完全背包
- uva 674Coin Change(完全背包)
- uva 674 Coin Change(完全背包)
- UVA 674 - Coin Change(完全背包)
- UVA 674 Coin Change(完全背包)
- UVA 674 Coin Change(完全背包)
- UVA - 674 Coin Change(完全背包)
- UVA 674 Coin Change(完全背包)
- UVA.674 Coin Change (DP 完全背包)
- UVA 674 Coin Change(完全背包)
- UVA 674 Coin Change(dp + 完全背包)
- 算法->完全背包问题 UVa 674 Coin Change
- uva 674 Coin Change(类似完全背包)
- UVA 674 Coin Change 钱币兑换问题 类似完全背包
- github总结
- MINA之心跳协议运用
- Hdu1053 step5.2.8(哈夫曼树)
- Android 混编 防止 反编译
- 657 - The die is cast(dfs)
- UVaOJ-674 Coin Change (完全背包)
- 去大公司实习还是去创业公司实习好?
- 寒假训练--训练赛2--冰冰的生日
- Android上用模板方法模式实现具有自动重用View功能的Adapter
- java中使用log4j 2
- Solr的HBase多条件查询
- windows下用Python连接mysql报错问题“MySQLdb in Python: “Can't connect to MySQL server on 'localhost'””
- 题目63:猴子下落
- Java(一)简介