有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john有多少種不同的選擇物品的方式。
輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有乙個1到40之間的正整數,分別給出a1,a2……an的值。
輸出不同的選擇物品的方式的數目。
21228321
105
1我們把輸入的體積數存入陣列,利用陣列下標表示每乙個物品的體積(從1開始,表示是第乙個物品,將體積存放在對應陣列中)0
我們從最後乙個往前取可以分為兩個情況:
1.不取最後乙個,取前面的就可以湊成40;
2.取最後乙個,那麼我們接著取前面的話就要將體積湊成40減去我們已經取得的物品的體積.
兩者相加就是取法的總數.
我們將遞迴函式定義成 int f(int a,int w) a表示前面還有a個物品,w表示我們需要湊成的體積總數。
那麼這兩種情況就可以表示成(假設用bag陣列儲存每個物品的體積)
1. f(a-1,b) 2.f(a-1,w-bag[a]) 。
而遞迴的邊界就是 當b==0,也就是我們前面取到的物品已經湊到了b,所以不需要再繼續取物品去湊體積的時候,表示我們已經湊成了一種情況,返回1。
當a<=0時,也就是前面已經沒有東西可取了的時候,表示我們湊不成目標體積b了,返回0。
#include int bag[22];
int f(int a,int w)//從 前a個物品中選出體積總和為w的物品
int main()
int count=f(n,40);
printf("%d\n",count);
} return 0;
}
codeup 問題 C 神奇的口袋
題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是...
codeup 神奇的口袋 C
題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是...
問題 C 神奇的口袋
題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是...