将拆分问题转化成背包问题计数(有多少种方案装满)
f[j]+=f[j-i]即可
注意一个技巧 mod 2147483648 直接做可能很慢,直接&0x7fffffff
#include<iostream>
using namespace std;
int f[5000];
int main()
{
int n;
f[0]=1;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
f[j]+=f[j-i];
f[j]=f[j]&0x7fffffff;
}
cout<<f[n]-1;
return 0;
}