UVA - 674 Coin Change 经典问题
2014-11-11 00:00
337 查看
题目大意:给出5中硬币,分别是1,5,10,25,50,然后给你一个数字,能由这五种硬币组成的方式有多少种
解题思路:解法一:硬币按小到大排,用j表示还有能用几种硬币表示,则当j==0时,则表示所剩下的值可以用n个1来表示,具体看代码
解法二:滚动数组的打表法,用dp[i]表示i能有几种表示方式,则dp[i] = dp[i] + dp[i-coin[j]],第二个dp[i]表示的是再第j种硬币之前的i能有几种表示方式
解题思路:解法一:硬币按小到大排,用j表示还有能用几种硬币表示,则当j==0时,则表示所剩下的值可以用n个1来表示,具体看代码
#include<cstdio> const int maxn = 7500; int coin[5] = {1,5,10,25,50}; int s[maxn][5],n; int dp(int i, int j) { if(j == 0) return s[i][j] = 1; if(s[i][j] > 0) return s[i][j]; for(int k = 0; k <= i; k += coin[j]) s[i][j] = s[i][j] + dp(i-k,j-1); return s[i][j]; } int main() { while(scanf("%d", &n) != EOF) { printf("%d\n", dp(n,4)); } return 0; }
解法二:滚动数组的打表法,用dp[i]表示i能有几种表示方式,则dp[i] = dp[i] + dp[i-coin[j]],第二个dp[i]表示的是再第j种硬币之前的i能有几种表示方式
#include<cstdio> #include<cstring> int dp[7500] = {0}; int coin[5] = {50,25,10,5,1}; int main() { dp[0] = 1; for(int i = 0 ; i < 5; i++) for(int j = coin[i]; j < 7500; j++) dp[j] += dp[j-coin[i]]; int num; while(scanf("%d",&num) != EOF) printf("%d\n",dp[num]); }
相关文章推荐
- 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
- UVa 10603 - Fill,经典倒水问题+隐式图搜索+dfs
- 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
- UVa 674 - Coin Change
- UVa 674 - Coin Change
- UVa 674 - Coin Change 背包dp
- UVA 674-Coin Change
- UVA 674 Coin Change
- uva 674 - Coin Change(dp)