01背包问题的DFS解法

直接dfs未剪枝代码

时间复杂度 O(2n^nn),其原因是对任意的物品,都是选或者不选(两次的情况)

  1. dfs三个形参
    物品序号index,放进背包的重量sumW,以及放进背包的总价值sumC
  2. 主要搜索路径
    序号为index的物品放入背包时
    序号为index的物品不放入背包时
//搜索路径dfs(index+1,sumW+w[index],sumC+c[index]);//选第index件放入背包dfs(index+1,sumW,sumC);//不选第index件放入背包

代码

#include<iostream>
using namespace std;
const int maxn=100;
int n,maxC=0,V,w[200],c[200];void dfs(int index,int sumW,int sumC ){//出口if(index==n){//遍历完所有 if(sumW<=V&&sumC>maxC)maxC=sumC;return ;} //搜索路径dfs(index+1,sumW+w[index],sumC+c[index]);//选第index件放入背包dfs(index+1,sumW,sumC);//不选第index件放入背包
}
int main(){cin>>n>>V;//n件物品,V背包容量 for(int i=0;i<n;i++)cin>>w[i]>>c[i];//w重量,c价值dfs(0,0,0);//初始化index,sumW,sumC都为0 cout<<maxC<<endl;return 0;}

剪枝
选择第index件物品放入背包之前,先检查重量是否超过背包容量V,如果超过,便不进入dfs递归分支。
而且更新最大价值maxC也不需要无时无刻更新,只需要在当第index件物品放入背包后的价值超过放进背包之前的价值时更新。

#include<iostream>
using namespace std;
const int maxn=100;
int n,maxC=0,V,w[200],c[200];void dfs(int index,int sumW,int sumC ){//出口if(index==n) return;//搜索路径dfs(index+1,sumW,sumC);//不选第index件物品放入背包 if(sumW+w[index]<=V){if(sumC+c[index]>maxC)maxC=sumC+c[index];dfs(index+1,sumW+w[index],sumC+c[index]);//选第index件物品放入背包}
}
int main(){cin>>n>>V;//n件物品,V背包容量 for(int i=0;i<n;i++)cin>>w[i]>>c[i];//w重量,c价值dfs(0,0,0);//初始化index,sumW,sumC都为0 cout<<maxC<<endl;return 0;}

对比剪枝前和剪枝后的代码,程序得以优化。

DFS解01背包问题相关推荐

  1. 探讨与研究——动态规划算法、回溯法、分支限界法解0-1背包问题

    一个人终归是要成长的,是要不断历练的,没有人可以安安稳稳一辈子.就算是最有地位最有钱的人也要不断追求.不断历练.不断提升自己. 人的学问少时在不断学习,青年时期不断实践.随着时间推移,到了老年终有所成 ...

  2. 算法题解:动态规划解0-1背包问题

    概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问 ...

  3. 算法——贪心算法解0-1背包问题

    问题的描述 我们先根据一个贪心算法的经典应用实例,然后给出贪心算法的实现步骤与关键环节,最后给出C++代码求解0-1背包问题. 背包问题(Knapsack Problem):有NN件物品有一个承重(也 ...

  4. 回溯法解01背包问题(最通俗易懂,附C++代码)

    问题描述: 01背包问题是算法中的经典问题,问题描述如下: 对于给定的N个物品,第i个物品的重量为Wi,价值为Vi,对于一个最多能装重量C的背包,应该如何选择放入包中的物品,使得包中物品的总价值最大? ...

  5. 回溯法解0-1背包问题(王晓东算法例题)

    给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问应怎样选择装入背包的物品,使得装入背包中物品的总价值最大? 整个解的空间相当于一个二叉树,左边是0,代表不取这个物品,右边是1 ...

  6. 动态规划解0-1背包问题

  7. 九种 0-1 背包问题详解

    目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题 (困难) 问题8:背 ...

  8. 【转】01背包问题动态规划详解

    转载自 sunstar1989 最终编辑 中华复生母 动态规划是用空间换时间的一种方法的抽象.其关键是发现子问题和记录其结果.然后利用这些结果减轻运算量. 比如01背包问题. 因为背包最大容量M未知. ...

  9. 动态规划背包问题详解(二)---0-1背包问题

    /**  * 对于技术面试,你还在死记硬背么?  * 快来"播"沙糖橘吧,  * 用视频案例为你实战解读技术难点  * 聚焦Java技术疑难点,实战视频为你答疑解惑  * 越&qu ...

最新文章

  1. 用OPENCV视觉解数独
  2. python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例
  3. GAN —— 《Generative Adversarial Nets》
  4. 阴阳师服务器维修拖延,阴阳师12月11日更新维护公告 阴阳师百闻牌联动开启
  5. hp eva 4400存储配置手记
  6. C++基础——new与delete
  7. viewHolder的作用
  8. USB-SC-09(假冒PL2303HXA芯片)WIN7-64位驱动之终极大法
  9. NoSQL数据库介绍(7)
  10. 《 HarmonyOS实战—可搭载在车机、大屏、智能手表、平板电脑、手机的计算器它来啦!》
  11. 有什么好用的股票回测接口?
  12. C语言入门(八)一维数组
  13. java 多个线程同时写同一个文件
  14. 2017-2018-2 20179204《网络攻防实践》linux基础
  15. htc e9pw android 6.0,HTC One E9+(E9pw 联通4G)一键ROOT教程,简单ROOT
  16. Ubuntu16.04升级 Ubuntu18.04
  17. 微商城分销系统软件首选—好分销微信三级分销系统源码定制
  18. Python金融股票和量化分析三方库汇总
  19. 2019年快来了,送给每位程序员一份新年计划清单...
  20. 仿人机器人学习笔记(一)坐标变换

热门文章

  1. ExpressionFuncT,TResult和FuncT,TResult
  2. IE6中Form.submit不提交的问题
  3. wap站点优于传统站点的异同分析
  4. 常用的HTML标签和属性解释
  5. 人工构造迭代次数高度简并的神经网络训练集
  6. cadence原理图软件(orcad)层级原理图与位号
  7. 【三维重建】基于切片的三维重建MATLAB仿真
  8. 十八、中断之独立按键
  9. O029、教你看懂OpenStack日志
  10. 关于同步加载与异步加载的区别