AcWing 900. 整数划分
原题链接
简单
作者:
南风可知意.
,
2023-03-19 16:11:19
,
所有人可见
,
阅读 28
法一:完全背包问题
#include <iostream>
using namespace std;
const int maxn = 1010, mod = 1e9 + 7;
int f[maxn];
int main()
{
int n;
cin >> n;
f[0] = 1;
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; ++j)
f[j] = (f[j] + f[j - i]) % mod;
/*
f[0][0] = 1;
for (int i = 1; i <= n; ++i)
for (int j = 0; j <= n; ++j)
{
f[i][j] = f[i - 1][j];
if (j >= i)
f[i][j] = (f[i][j - i] + f[i][j]) % mod;
}
*/
cout << f[n] << endl;
return 0;
}
法二:总和是i,恰好表示成j个数的和
#include <iostream>
using namespace std;
const int maxn = 1010, mod = 1e9 + 7;
int f[maxn][maxn];
int main()
{
int n;
cin >> n;
f[0][0] = 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j) // i最多表示成i个数的和
f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;
int ans = 0;
for (int i = 1; i <= n; ++i)
ans = (ans + f[n][i]) % mod;
cout << ans << endl;
return 0;
}