問題 c: 神奇的口袋
[命題人 : 外部匯入]
時間限制 : 1.000 sec 記憶體限制 : 32 mb
解決: 1034提交: 2292統計
題目描述
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john有多少種不同的選擇物品的方式。
輸入輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有乙個1到40之間的正整數,分別給出a1,a2……an的值。
輸出輸出不同的選擇物品的方式的數目。
樣例輸入 copy212
2832110
5樣例輸出 copy10
首先,這道題是口袋問題,即是一種組合問題,組合問題區別於排列問題,在於遞推式是不斷往下,即這個遞推式往下推,而且這個index的終結點,是數而不是位置,所以也要進行邊界判斷。並且說明index最大只可能為n+1,所以不用擔心其他問題,還有一點就是,組合的方式它不再是填數,所以它可以肆無忌憚地拿東西,記得在結束之前判斷是否滿足了條件即可。。。。。
#include
#include
#include
#include
#include
using
namespace std;
int a[22]
=;int n;
int total =40;
int countt =0;
intgenerate
(int index)
//如果本次的位置 之前已經把40湊足,不用再繼續遞迴了
if(total==0)
//區別於搜尋的是,每次遞迴了就肯定拿了,所以沒必要放if邊界判斷裡面
if(index == n +1)
return0;
///別再犯錯了!!!
//可以看成也是一種搜尋,,,for裡面多個岔口!!!!
for(
int ii = index; ii <= n; ii++)}
intmain()
generate(1
);printf
("%d\n"
,countt);}
return0;
}
下面再介紹一種直接搜尋的辦法,,其實搜尋比較容易理解,,,並且也模擬了拿與不拿的結果值,不用手工的加與減,這樣的話,結果判斷就容易許多,而且不用擔心拿太多,total容量不夠放,所以一直搜尋就行,搜尋的本義即是拿與不拿,,,,不斷增加各種組合,它也是一種不會回退的方式,一直拿,不會重複拿,即一種組合的方式。至此思維導圖聯絡起來,做題要麼選排列,要麼選組合,組合分為兩種,一種是用for模擬附帶操作,一種是直接搜尋。
#include
#include
#include
#include
#include
using
namespace std;
int a[22]
;int n;
int total =40;
int countt =0;
intgenerate
(int index,
int sum)
if(index == n +1)
generate
(index+
1,sum+a[index]);
//對位置的遞迴,不斷拿數 下乙個數
generate
(index+
1,sum)
;//對位置的遞迴,不斷拿數 下乙個數
}int
main()
generate(1
,0);
printf
("%d\n"
,countt);}
return0;
}
問題 C 神奇的口袋
題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是...
問題 C 神奇的口袋
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...
問題 C 神奇的口袋
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...