牛牛的背包问题

题目:

牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。 
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。 
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。

输入描述:

输入包括两行 
第一行为两个正整数nw,表示零食的数量和背包的容量。 
第二行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 }
原文地址:https://www.cnblogs.com/Kiven5197/p/8718305.html