AcWing 900. 整数划分
第一种方法:
思路分析:
由于是求方案数所以是所有情况的总和
ans = f(i - 1, j) + f(i - 1, j - i) + f(i - 1, j - 2i) + ... + f(i - 1, j - si)
状态转移方程: f[i][j] = f[i - 1][j] + f[i][j - i];
代码展示:
#include <iostream>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int f[N];
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;
}
}
cout << f[n] << endl;
}
第二种方法:
思路分析:
状态转移方程:f[i][j] = f[i - 1][j - 1] + f[i - j][j]
代码展示:
#include <iostream>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int f[N][N];
int main()
{
int n;
cin >> n;
f[0][0] = 1;
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= i; j ++ )
{
f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;
}
}
int res = 0;
for (int i = 1; i <= n; i ++ ) res = (res + f[n][i]) % mod;
cout << res << endl;
}