题目大意:给你几种价值的钱币,问能有几种组合方式可以组成所给的钱数(每种钱币假设有无限多个)
View Code
 1   #include <cstdio>
 2   #include <cstring>
 3   #include <algorithm>
 4   
 5   using namespace std;
 6   
 7   int dp[302], ans[302];//dp[i]表示钱数到达i的方法个数;
 8   int n, c[10], cnt;
 9   //利用动态规划的思想来解题;
10  int main()
11  {
12      int j, i, k, tem;
13     while (scanf ("%d%d", &n, &cnt) != EOF)
14     {
15            memset (dp, 0, sizeof (dp));
16           memset (ans, 0, sizeof (ans));
17           for (i = 0;i < cnt;i++) scanf ("%d", &c[i]);
18            for (i = 0;i <= n;i += c[0]) ans[i] = 1;
19           for (i = 1;i < cnt;i++)
20            {
21               for (j = 0;j <= n;j++)
22                {
23                   for (k = 0;k + j <= n;k += c[i])
24                        dp[k + j] += ans[j];
25                }
26                for (j = 0;j <= n;j++) ans[j] = dp[j], dp[j] = 0;//每一次循环后都要重新赋值,避免重复; 
27            }
28            printf ("%d\n", ans[n]);
29      }
30  }