题目:
输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。
输入格式:
输入只有一个整数n,表示待拆分的自然数n。 1<=n<=4000
输出格式:
输出一个数,即所有方案数
因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。
输入样例
7
输出样例
14
思路:
这是一个典型的完全背包模型,1~N个自然数构成N中物品,每种物品都可以无限次使用,背包容量为N。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX_N = 10000;
unsigned int f[MAX_N + 1], n;
int main() {
cin >> n;
memset(f, 0, sizeof(f));
f[0] = 1;
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
f[j] = (f[j] + f[j - i]) % 2147483648u;
cout << (f[n] > 0 ? f[n] - 1 : 2147483647) <<endl;
}