DFS解01背包问题
01背包问题的DFS解法
直接dfs未剪枝代码
时间复杂度 O(2n^nn),其原因是对任意的物品,都是选或者不选(两次的情况)
- dfs三个形参
物品序号index,放进背包的重量sumW,以及放进背包的总价值sumC - 主要搜索路径
序号为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背包问题相关推荐
- 探讨与研究——动态规划算法、回溯法、分支限界法解0-1背包问题
一个人终归是要成长的,是要不断历练的,没有人可以安安稳稳一辈子.就算是最有地位最有钱的人也要不断追求.不断历练.不断提升自己. 人的学问少时在不断学习,青年时期不断实践.随着时间推移,到了老年终有所成 ...
- 算法题解:动态规划解0-1背包问题
概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问 ...
- 算法——贪心算法解0-1背包问题
问题的描述 我们先根据一个贪心算法的经典应用实例,然后给出贪心算法的实现步骤与关键环节,最后给出C++代码求解0-1背包问题. 背包问题(Knapsack Problem):有NN件物品有一个承重(也 ...
- 回溯法解01背包问题(最通俗易懂,附C++代码)
问题描述: 01背包问题是算法中的经典问题,问题描述如下: 对于给定的N个物品,第i个物品的重量为Wi,价值为Vi,对于一个最多能装重量C的背包,应该如何选择放入包中的物品,使得包中物品的总价值最大? ...
- 回溯法解0-1背包问题(王晓东算法例题)
给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问应怎样选择装入背包的物品,使得装入背包中物品的总价值最大? 整个解的空间相当于一个二叉树,左边是0,代表不取这个物品,右边是1 ...
- 动态规划解0-1背包问题
- 九种 0-1 背包问题详解
目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题 (困难) 问题8:背 ...
- 【转】01背包问题动态规划详解
转载自 sunstar1989 最终编辑 中华复生母 动态规划是用空间换时间的一种方法的抽象.其关键是发现子问题和记录其结果.然后利用这些结果减轻运算量. 比如01背包问题. 因为背包最大容量M未知. ...
- 动态规划背包问题详解(二)---0-1背包问题
/** * 对于技术面试,你还在死记硬背么? * 快来"播"沙糖橘吧, * 用视频案例为你实战解读技术难点 * 聚焦Java技术疑难点,实战视频为你答疑解惑 * 越&qu ...
最新文章
- 用OPENCV视觉解数独
- python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例
- GAN —— 《Generative Adversarial Nets》
- 阴阳师服务器维修拖延,阴阳师12月11日更新维护公告 阴阳师百闻牌联动开启
- hp eva 4400存储配置手记
- C++基础——new与delete
- viewHolder的作用
- USB-SC-09(假冒PL2303HXA芯片)WIN7-64位驱动之终极大法
- NoSQL数据库介绍(7)
- 《 HarmonyOS实战—可搭载在车机、大屏、智能手表、平板电脑、手机的计算器它来啦!》
- 有什么好用的股票回测接口?
- C语言入门(八)一维数组
- java 多个线程同时写同一个文件
- 2017-2018-2 20179204《网络攻防实践》linux基础
- htc e9pw android 6.0,HTC One E9+(E9pw 联通4G)一键ROOT教程,简单ROOT
- Ubuntu16.04升级 Ubuntu18.04
- 微商城分销系统软件首选—好分销微信三级分销系统源码定制
- Python金融股票和量化分析三方库汇总
- 2019年快来了,送给每位程序员一份新年计划清单...
- 仿人机器人学习笔记(一)坐标变换