AcWing 279. 自然数拆分
考察:完全背包dp
思路:
n可以看成体积为n,从1~n-1的数选的背包.因为f[i][j]代表从前i个数选,体积恰好为j的方案数.
感觉我代码刷新前后是一模一样的,刷新前是输出错误答案,刷新后又对了 = =
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 typedef long long ll; 6 const ll Mod = 2147483648ll; 7 const int N = 4010; 8 ll f[N]; 9 int main() 10 { 11 int n; 12 scanf("%d",&n); 13 f[0] = 1; 14 for(int i=1;i<n;i++) 15 for(int j=i;j<=n;j++) 16 f[j] = (f[j]+f[j-i])%Mod; 17 printf("%lld\n",f[n]); 18 return 0; 19 }
总结:
- 注意f[i][j]是否有恰好的含义,恰好只需要初始化f[0][0] = 0
- 不是恰好的话,需要+w[i]