整数划分
原题链接
方法一:完全背包+一维滚动数组
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010,mod=1e9+7;
int n;
int f[N];
int main()
{
cin>>n;
f[0]=1;//f[][0]=>体积是0,只有一种选法,啥都不选
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
f[j]=(f[j]+f[j-i])%mod;
cout<<f[n]<<endl;
return 0;
}
方法二:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010,mod=1e9+7;
int dp[N][N];
int n;
int main()
{
cin>>n;
dp[0][0]=1;//j=0,总和等于0, 不选 是一种方案
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]=(dp[i-1][j-1]+dp[i-j][j])%mod;
int ans=0;
for(int i=1;i<=n;i++)
ans=(ans+dp[n][i])%mod;
cout<<ans<<endl;
return 0;
}
网友评论