HDU -1284钱币兑换

这个是完全背包的基础题, 模拟换钱, 刚开始状态方程写错了,我直接写dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3], 然后想了想感觉太大了,不太对,后来看网上的代码看着两层for循环,基本是一样的,为什么我的不对啊,然后手工模拟了一个小例子,发现,这种状态转移方程算重了,多加了好多重复的,因为完全背包和01背包代码的的区别,就是第二层for循环的顺序,所以这个题也不例外,这个题是完全背包,因为它可以无限取,代码如下

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 const int N = 40000;
 6 long long dp[N];
 7 int main()
 8 {
 9     //预处理
10     dp[0] = 1;
11     for (int i = 1; i <= 3; i++)
12     {
13         for (int j = i; j <= N; j++)
14             dp[j] += dp[j - i];
15     }
16     int n;
17     while (cin >> n)
18     {
19         cout << dp[n] << endl;
20     }
21 
22     return 0;
23 }
原文地址:https://www.cnblogs.com/Howe-Young/p/4154273.html