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

2022-05-10 07:33:08 字數 1507 閱讀 8012

總時間限制: 

10000ms

記憶體限制: 

65536kb

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

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

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

樣例輸入

3

2020

20

樣例輸出

3
1

//法一 :遞迴 把物品數目n和物品體積陣列a[100]設為全域性變數;2//

count(i,sum)表示從陣列的第i個數開始往後統計的組合數和為sum的種類數,3//

sum為組合數的和,則:cout(i,sum)=cout(i+1,sum-a[i])+cout(i+1,sum),4//

其中cout(i+1,sum-a[i])表示包含了a[i],即為從第i+1個數開始往後統計5//

組合數的和為sum-a[i]的種類數, 而cout(i+1,sum)表示不包含a[i], 即為從第i+1個數開始往後統計組合數的和為sum的種類數 ***********************************

6 #include7

using

namespace

std;89

int a[100

];10

int n=1;11

int count(int i,int

sum)

15if(i==n||sum<0) return

0;//

i==n說明沒有其他的數來組合,sum<0說明組合不出;

16return count(i+1,sum-a[i])+count(i+1,sum);//

從陣列的第i為開始,包含a[i],和不包含;17}

1819

intmain()

25return0;

26 }

1

//法二:動態規劃

2 #include3

using

namespace

std;

4#define n 100

5int

n,a[n];

6int

main()

13 dp[0][0]=1;14

for(int i=1; i<=n; i++)

15for(int j=1; j<=40; j++)

20 cout<40]<21delete

dp;22}23

return0;

24 }

百練2755 神奇的口袋 遞迴與動態規劃

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

百練2755 神奇的口袋(動態規劃)

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

2755 神奇的口袋

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