uva674Coin Change

题意:手中的硬币币值有1,5,10,25,50共5种,给定一个面值n,问把n兑换成硬币的方案总数是多少。

分析:先打表,再输入输出。动态规划的简单题目,设dp[i]表示面值为i的情况下能兑换的种类,那么dp[i]=sigma(dp[i-v[j]]), j=0..4, v[j]={1,5,10,25,50};也就是,如果i大于v[j],说明能够用dp[i-v[j]]的方案再加上一枚面值为v[j]的硬币作为面值i的方案,不过这只是方案中硬币的数量多了一枚,题目中只是问方案数量,那么此时两者在方案数量上等价,那么方案总数上加上这一种情况就可以了。

代码:

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 using namespace std;
 5 #define DEBUG
 6 const int MAXN = 7500;
 7 int dp[MAXN];
 8 int main(){
 9 #ifndef DEBUG
10     freopen("in.txt", "r", stdin);
11 #endif
12     int i, j;
13     int v[5] = {1, 5, 10, 25, 50};
14     memset(dp, 0, sizeof dp);
15     dp[0] = 1;
16     for(i=0; i<5; i++)
17         for(j=1; j<MAXN; j++)
18             if(j>=v[i]) dp[j]+=dp[j-v[i]];
19     int n;
20     while(scanf("%d", &n)!=EOF) printf("%d\n", dp[n]);
21     return 0;
22 }
Greatness is never a given, it must be earned.
原文地址:https://www.cnblogs.com/zjutzz/p/2910733.html