題目:
牛牛准備參加學校組織的春游, 出發前牛牛准備往背包里裝入一些零食, 牛牛的背包容量為
w
。
牛牛家里一共有n
袋零食, 第i
袋零食體積為v[i]
。
牛牛想知道在總體積不超過背包容量的情況下,他一共有多少種零食放法(總體積為0
也算一種放法)。輸入描述:
輸入包括兩行
第一行為兩個正整數n
和w
,表示零食的數量和背包的容量。
第二行n
個正整數v[i]
,表示每袋零食的體積。輸出描述:
輸出一個正整數, 表示牛牛一共有多少種零食放法。
樣例:
in: 3 10 1 2 4 out: 8
名曰dp,實則搜索。
AC代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 long long v[40]; 5 int n; 6 7 long long ans=0,w; 8 9 void dfs(int t,long long sum){ 10 ans++; 11 if(t==n-1){ 12 return ; 13 } 14 for(int i=t+1;i<n;i++){ 15 if(sum+v[i]<=w){ 16 dfs(i,sum+v[i]); 17 } 18 } 19 } 20 21 int main(){ 22 //long long w; 23 cin>>n>>w; 24 long long sum=0; 25 for(int i=0;i<n;i++){ 26 cin>>v[i]; 27 sum+=v[i]; 28 } 29 if(sum<=w){ 30 ans=1<<n; 31 } 32 else{ 33 dfs(-1,0); 34 } 35 cout<<ans<<endl; 36 return 0; 37 }