CHOJ 5202 自然數拆分Lunatic版 【完全揹包模型】

神探小小迪發表於2018-09-24

描述

給定一個自然數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;
}

 

相關文章