状态设计:
- f[n]:自然数n的拆分方案数.
- f[x]=f[x]+f[x-k](x>=k).
初始值:
- f[0]=1.
易错点:
- 如果第一层循环是从1循环到n,就会发现f[n]+=f[0],即多加了一个1.
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
const int MAXN=8e3,MOD=2147483648;
ll f[MAXN];
int main(){
int n;
scanf("%d",&n);
f[0]=1;//init
for(int i=1;i<n;i++){
for(int j=i;j<=n;j++){
f[j]=(f[j]+f[j-i])%MOD;
}
}
printf("%d\n",f[n]);
return 0;
}