给一个数n(n <= 1000),问将这个n分解成n1,n2,n3...nk的解法有多少(k >= 1 且 n1 >= n2 >= n3 ...>= nk >= 1)

由于答案可能过大, 因此答案对1e9+7取模

1. 背包问题解决,这里可看作,结果恰好为n的,小于n的正整数有无数个的背包问题

f[i][j]表示在1~i中选择,结果恰好是j的方案数


☆已知在j中选i最多选k个

总结果为j,在1~i中选择,1.不选i:f[i-1][j] 2.选k个i:f[i-1][k];
f[i][j] = f[i - 1][j] + f[i - 1][j - i] + f[i - 1][j - 2 * i] + ... + f[i - 1][j - k * i];


总结果为j-i,在1~i中选择 1.不选i:f[i-1][j-i] 2.选k - 1个i:f[i-1][j - k * i];
f[i][j - i] =           f[i - 1][j - i] + f[i - 2][j - i] + f[i - 2][j - 2 * i] + ... + f[i - 2][j - k * i];


所以得 f[i][j] = f[i - 1][j] + f[i][j - i]; 


f[0][0] = 1;
for(int i = 1; i <= n; i++)
    for(int j = i; j <= n; j++)
        f[i][j] = (f[i - i][j] + f[i][j - i]) % mod;

可以转换成一维
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;

由于是递增枚举的,所以我们可以知道,当求第i层的f[j]时,我们用于计算的f[j]还是第i-1层的,而由于递增枚举,因此f[j - i]是第i层的,因此第一维可以直接去掉转换成一维计算即可