AcWing 900. 整数划分
输入样例:
5
输出样例:
7
可以将问题看成是 容量是 n 的背包,背包里面物体的体积分别是 1 ~ n ,每种物品无限次使用
等价于一个 完全背包问题
由下图观察可得:
进一步优化可得:
#include <iostream> #include <algorithm> using namespace std; const int N = 1010, M = 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]) % M; cout << f[n] << endl; return 0; }
#include <iostream> #include <algorithm> using namespace std; const int N = 1010, M = 1e9 + 7; int n; int f[N][N]; int main() { 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]) % M; int res = 0; for(int i = 1; i <= n; i ++ ) res = (res + f[n][i]) % M; cout << res << endl; return 0; }