0052 自然数拆分
题目
把n拆成若干个数的和的形式,每个数可以重复,完全背包,因该是一个模板
所以直接去打就好了
注意在拆分n=n这种情况是不满足的,需要在最后减去这种情况,所以设f[i]表示i的拆分数量,边界f[0]=1 f[1]=0表示0只有0+0这种拆分,1没有拆分,因为1=1
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const long long mod = 2147483647;
ll dp[5000];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
dp[0] = 1;
dp[1] = 0;
for(int i = 1;i <= n;i++)
for(int j = i;j <= n;j++)
dp[j] = (dp[j]+dp[j-i])%mod;//取这个数加上不取这个数的价值
cout<<(dp[n]>0?dp[n]-1:mod-1)<<endl;//需要把自己减去,然后判断为正负,取余的性质
}
return 0;
}