找零钱(经典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\n", 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 }