题目大意:有5中类型的硬币:1分,5分,10分,25分和50分,现在给你一定数额的金钱n(以分为单位),让你计算有多少中方法可以将这个数额的钱换成硬币,不同次序算同一种,如1,1,5和1,5,1算一种。
硬币兑换问题,经典DP。可以dp[i]保存换i数额的硬币兑换方法数,如果用dp[i] += dp[i-coin]的递推公式的话计算出的是考虑顺序的兑换方法数,所以分五次转移,这样就可以避免重复。理解的不是太清楚,个人感觉就是构造时按照大小顺序先后构造,只考虑1,1,5的方案,不会计算1,5,1和5,1,1这样的方案。
1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 7490 4 5 int dp[MAXN]; 6 const int coin[5] = {1, 5, 10, 25, 50}; 7 8 int main() 9 { 10 #ifdef LOCAL 11 freopen("in", "r", stdin); 12 #endif 13 memset(dp, 0, sizeof(dp)); 14 dp[0] = 1; 15 for (int k = 0; k < 5; k++) 16 for (int i = 1; i < MAXN; i++) 17 if (i >= coin[k]) 18 dp[i] += dp[i-coin[k]]; 19 int n; 20 while (scanf("%d", &n) != EOF) 21 printf("%d ", dp[n]); 22 return 0; 23 }