[codeup] 2044 神奇的口袋
阿新 • • 發佈:2019-02-08
!= 得到 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 神奇的口袋