描述
给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。求拆分的方案数 mod 2147483648的结果。1≤N≤4000。
输入格式
一个整数n。
输出格式
输出一个数,即所有方案数
因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。
样例输入
7
样例输出
14
样例解释
输入7,则7拆分的结果是
7=1+6
7=1+1+5
7=1+1+1+4
7=1+1+1+1+3
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
7=1+1+1+2+2
7=1+1+2+3
7=1+2+4
7=1+2+2+2
7=1+3+3
7=2+5
7=2+2+3
7=3+4
一共有14种情况,所以输出14 mod 2147483648,即14
题解:1 ~ n 这 n 个正整数可以看作 n 件物品,每种物品都可以无限次使用,背包容量为 n。求方案数的时候将 max 函数改为求和就好了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define mod 2147483648
#define ll long long
using namespace std;
const int maxn = 4000+7;
ll f[maxn];
int n;
int main()
{int i, j;cin >> n;memset(f, 0, sizeof f);f[0] = 1;for(i = 1; i <= n; i++)for(j = i; j <= n; j++)f[j] = (f[j] + f[j-i]) % mod;cout << (f[n] > 0 ? f[n]-1 : 2147483648) << endl;return 0;
}