当前位置: 代码迷 >> 综合 >> CHOJ 5202 自然数拆分Lunatic版 【完全背包模型】
  详细解决方案

CHOJ 5202 自然数拆分Lunatic版 【完全背包模型】

热度:51   发布时间:2023-11-28 06:57:09.0

描述

给定一个自然数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;
}