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

Posted keep23456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索DFS---01背包问题相关的知识,希望对你有一定的参考价值。

题目:

有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 const int maxn = 30;
 5 int n,v,MAXValue;//物品个数,背包容量
 6 int w[maxn] = {0},c[maxn] = {0}; //每件物品的重量为w[i],价值为c[i]
 7 
 8 void DFS(int index, int sumW, int sumC) {//index表示当前要选择的物品,sumW表示当前的总重量,sumC表示当前的总价值
 9     if(index == n) { //完成了对 n 个物品的选择---递归边界
10         MAXValue = max(MAXValue,sumC);//更新物品的最大总价值
11         return ;
12     }
13     DFS(index+1,sumW,sumC);//不选择当前物品
14     if(sumW + w[index+1] <= v)//剪枝操作
15         DFS(index+1,sumW + w[index+1],sumC + c[index+1]);//选择当前物品
16 }
17 int main() {
18     cin>>n>>v;
19     for(int i = 0; i < n; ++i)
20         cin>>w[i];
21     for(int i = 0; i < n; ++i)
22         cin>>c[i];
23     int sumW = 0,sumC = 0;
24     DFS(0,sumW,sumC);
25     cout<<MAXValue;
26     return 0;
27 }

运行结果:

技术图片

 

 

 

//选择当前物品 

以上是关于深度优先搜索DFS---01背包问题的主要内容,如果未能解决你的问题,请参考以下文章

0/1背包问题(回溯法)

算法笔记8.1 深度优先搜索DFS

动态规划初探 -- 背包问题

会超时的dfs01背包+快一点的一维DP01背包

怎样用动态规划算法解决24点问题,稍详细些,谢谢

搜索算法---深度优先搜索