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 }

 

总结:

  1. 注意f[i][j]是否有恰好的含义,恰好只需要初始化f[0][0] = 0
  2. 不是恰好的话,需要+w[i]
posted @ 2021-02-02 11:14  acmloser  阅读(59)  评论(0编辑  收藏  举报