總時間限制:
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可以從這些物品中選擇一些,...