神奇的口袋(動態規劃)

2021-10-04 23:06:09 字數 1012 閱讀 5020

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

input 輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有乙個1到40之間的正整數,分別給出a 1,a 2……a n的值。 output 輸出不同的選擇物品的方式的數目。 sample input

3

2020

20

sample output
3

題解:解題思路在**注釋中

1 #include2 #include3

using

namespace

std;45

int a[30

], n;67

int ways[50][40];8

9int

main()

18//

同理,把way[0][0]邊界也設為 1

19 ways[0][0] = 1;20

//w 代表需要湊成的體積, k代表第 k的物品, way[w][k]用來儲存 k個物品湊成 w體積的方法個數

21//

要求way[w][k],只要考慮第 k個物品取不取

22//

所以way[w][k] = way[w - a[k]][k-1] + way[w][k-1]

23for(int w = 1; w <= 40; w++) 29}

30//

所以本體所求即為n件物品湊成40體積的方法數

31 cout << ways[40][n] <33return0;

34 }

神奇的口袋(動態規劃)

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a 1,a 2 a n。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,j...

動態規劃之神奇的口袋

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n 1 n 20 個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的...

2755 神奇的口袋(遞迴 動態規劃)

總時間限制 10000ms 記憶體限制 65536kb 描述有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神...