7 2 口袋(遞迴 遞推)

2021-09-26 11:15:23 字數 1299 閱讀 1671

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

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

遞迴方法

int ways1 = choice(v - vol[k - 1], k - 1);    //選第k種,note:vol下標自0開始

int ways2 = choice(v, k - 1);                     //不選第k種

return ways1 + ways2

choice(40,3)=choice(20,2)+choice(20,2)

=choice( 20,1)+choice(40,1)+choice(20,2)

=choice(0,0)+choice(20,0)+choice(40,1)+choice(20,2)

=1+0+choice(40,1)+choice(20,2)

=1+choice(40,1)+choice(20,2)=......

#includeint n;

int vol[20];

int ways = 0;

int choice(int v, int k)

}int main()

遞推:

自邊界開始,計算每一種可能,儲存到二維陣列中。

#includeusing namespace std;

const int nmax = 20;

const int vmax = 41;

int n;

int vol[nmax];

int ways[vmax][nmax]; //二維陣列記錄,ways[i][j],從前j種物品中取出體積i的方法數;

int main()

ways[0][0] = 1; //note:for迴圈中i自1開始,補齊邊界;

P1195 口袋的天空

小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...

P1195 口袋的天空

給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試資料的 第一行有三個數n,m,k 1 n 1000,1 m 10000,1 k 10 接下來m個數每行三個數x,y,l,表...

luoguP1195 口袋的天空

標籤 雲端 難度 普及 提高 時空限制 1s 128mb 小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵...