1. 程式人生 > >[codeup] 2044 神奇的口袋

[codeup] 2044 神奇的口袋

!= 得到 printf 問題 體積 for space %d i++

題目描述

有一個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。John現在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。John可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麽利用這個神奇的口袋,John就可以得到這些物品。現在的問題是,John有多少種不同的選擇物品的方式。

輸入

輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有一個1到40之間的正整數,分別給出a1,a2……an的值。

輸出

輸出不同的選擇物品的方式的數目。

樣例輸入

2
12
28
3
21
10
5

樣例輸出

1
0

思路

DP問題,等式 DP[w][i] = DP[w][i-1] + DP[w-a[i]][i-1]

每次分為取第 i 個與不取第 i 個兩種,取第 i 個則減去體積 a[i] 。

代碼

#include <cstdio>
using namespace std;

int a[21];

int foo(int w, int n)
{
    if (w == 0)
        return 1;
    if (w < 0)
        return 0;
    if (n <= 0)
        return 0;
    return foo(w, n - 1) + foo(w - a[n], n - 1);
}

int main()
{
    int n;

    while (scanf("%d", &n) && n != 0) {
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        printf("%d\n", foo(40, n));
    }
    
    return 0;
}

[codeup] 2044 神奇的口袋