2755 神奇的口袋

2021-10-24 02:32:53 字數 1520 閱讀 8988

2755:神奇的口袋

檢視提交統計提示提問

總時間限制: 10000ms 記憶體限制: 65536kb

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

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

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

樣例輸入320

2020

樣例輸出

3

/*

2755:神奇的口袋

思路,1.遞迴解法,設定乙個函式int ways(int w,int k)表示從前k種物品中選出

重量為w的物品的方案,遞迴函式為 ways(w,k) = ways(w-a[k],k-1) + ways(w,k-1)

遞迴終止條件為ways(0,k) == 1,即選擇完畢,ways(w,0) == 0,即選完所有的也達不到

重量 */

#includeusing namespace std;

int a[30],n; //a代表各個物體的重量

int ways(int w,int k)

int main()

cout << ways(40,n);

return 0;

}

/*

2755:神奇的口袋

思路,1.遞迴解法,設定乙個函式int ways(int w,int k)表示從前k種物品中選出

重量為w的物品的方案,遞迴函式為 ways(w,k) = ways(w-a[k],k-1) + ways(w,k-1)

遞迴終止條件為ways(0,k) == 1,即選擇完畢,ways(w,0) == 0,即選完所有的也達不到

重量2.遞推解法,設定乙個陣列ways[w][k]表示從前k種物品中取出重量為w的物品的方案

if(w - a[k] >= 0) ways[w][k] = ways[w][k-1] + ways[w - a[k]][k-1]

else ways[w][k] = ways[w][k-1]

初始條件為ways[0][k] = 1; ways[w][0] = 0(w,k > 0)

注意ways[0][0] = 0,此時恰好分配完畢

*/#includeusing namespace std;

int ways[50][50],n,a[50];

int main()

ways[0][0] = 1;

for(int w = 1;w <= 40;++w)

} cout << ways[40][n];

return 0;

}

百練 2755 神奇的口袋

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

百練 2755 神奇的口袋

遞迴 include include include includeusing namespace std const int maxn 30 int n,d maxn int dp int w,int n int main 人人為我動歸 狀態定義 揹包容量為i時,選完前j件物品後,能達到該容量的最...

Openjudge 2755 神奇的口袋

我們來分析一下題目,從k種物品中選出幾個,每種只能選出乙個,看能有多少種填法能將揹包填滿。我先說用遞迴的寫法,首先傳給遞迴函式兩個引數,乙個是口袋的空間,乙個是還有多少個物品可以選擇。從第k個開始選擇,然後填入口袋。但是第k 1個物品不想填該怎麼操作?下面貼出 includeusing namesp...