牛牛的背包问题
题目:
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为
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 }