完全背包法
#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;
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;
}
dp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n;
int f[N][N];
int main()
{
cin >> n;
f[1][1] = 1; //左边代表数字
for (int i = 2; i <= n; i ++ )
for (int j = 1; j <= i; j ++ ) //对与 i 最多可以用1~i个数字来表达
f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;
//第i个整数用j个数进行划分
//f[i - 1][j - 1] j-1
//i - j 已经选择了 j 个数作为划分的一部分,并且这些数的总和为 j,
// 那么我们从原始整数 i 中减去 j,得到一个新的整数 i - j
int res = 0;
for (int i = 1; i <= n; i ++ ) res = (res + f[n][i]) % mod;
cout << res << endl;
return 0;
}
这题怎么想也想不明白