找零钱(经典DP)

面值有1, 2, 5, 10, 20, 50, 100,输入n(n<=100),求凑成n的种数

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int a[] = {1, 2, 5, 10, 20, 50, 100};
 6 
 7 void solve(int n)
 8 {
 9     int dp[101][251];
10 
11     memset(dp, 0, sizeof(dp));
12     dp[0][0] = 1;    //个数为0,总金额为0,初始化一种
13 
14     for(int i=0; i<7; i++)   //七种面值
15     {
16         for(int num=1; num<=100; num++)   //零钱个数
17         {
18             for(int j=a[i]; j<=n; j++)  //当钱数大于当前面值的时候,
19                           //都可以用当前面值,相应钱数应减去当前面值
20             {
21                 dp[num][j] += dp[num-1][j-a[i]];
22             }
23         }
24     }
25 
26     int re = 0;
27     for(int i=0; i<=100; i++)
28     {
29         re += dp[i][n];  //不同个数组成的n,加和即为答案
30     }
31 
32     printf("%d
", re);
33 }
34 
35 int main()
36 {
37     int n;
38     while(~scanf("%d", &n) && n)
39     {
40         solve(n);
41     }
42     return 0;
43 }
原文地址:https://www.cnblogs.com/0xiaoyu/p/11337984.html