这个是完全背包的基础题, 模拟换钱, 刚开始状态方程写错了,我直接写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 }