深度优先搜索DFS---01背包问题(1)

题目:

有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干件物品放入一个容量为 V 的背包中,使得在选入背包的物品重量之和,不超过容量V的前提下,让北欧保重物品的价值之和最大,求最大价值。(1<=n<=20)

输入格式:

第一行要求给出 N个物品(1<=N<=20),和容量V;

第二行要求给出 N个物品的重量;

第三行要求给出 N个物品的价值。

输出格式:

输出物品的最大总价值MAXValue。

输入样例:

5 8

3 5 1 2 2

4 5 2 1 3

输出样例:

10

直接上代码。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 30;
 6 int n,v,MAXValue;//物品个数,背包容量
 7 int w[maxn] = {0},c[maxn] = {0}; //每件物品的重量为w[i],价值为c[i]
 8 
 9 void DFS(int index, int sumW, int sumC) {
10     if(index == n) { //完成对 n个 物品的选择---递归边界
11         MAXValue = max(MAXValue,sumC);//更新最大价值MAXValue
12         return ;
13     }
14     if(sumW + w[index] <= v)//“选择”当前物品 ,不超过背包最大容量时
15         DFS(index+1,sumW + w[index],sumC + c[index]);
16     DFS(index+1,sumW,sumC);//“不选择”当前物品
17 }
18 int main() {
19     cin>>n>>v;
20     for(int i = 0; i < n; ++i)
21         cin>>w[i];
22     for(int i = 0; i < n; ++i)
23         cin>>c[i];
24     DFS(0,0,0);//初始时为第 0件物品、当前总重量和总价值 均为0
25     cout<<MAXValue;
26     return 0;
27 }

运行结果:

posted @ 2020-02-26 22:03  tangq123  阅读(1130)  评论(0)    收藏  举报