回溯--深度优先搜索(01背包)
来源:互联网 发布:机地手机维修淘宝 编辑:程序博客网 时间:2024/05/17 07:23
背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题。
POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案。
我们的数组基于这样一种假设:
totalN表示物品的种类,totalW表示背包的容量
w[i]表示第i件物品的重量,d[i]表示第i件物品的价值。
#include <iostream>#define NUM 3405using namespace std;int N,M;//N表示物品的数目;M表示包最大的重量;int w[NUM];int v[NUM];int rest_V[NUM];int temp_w = 0;int temp_v = 0;int MAX_v = 0;void DFS(int dot){ if(dot>N){ MAX_v = max(MAX_v,temp_v); return ; } for(int i = 0;i<=1;i++){ if(i == 0){//第一次最优性的剪枝; DFS(dot+1); } else{ if(temp_w+w[dot]*i>M)//可行性剪枝; continue; if(rest_V[dot]+temp_v+v[dot]<=MAX_v)//第二次剪枝 //如果是计算到当前的位置判断是气候所有的价格加上当前的价格不于已经储存的最大的价格,直接就剪枝; continue; temp_w +=w[dot]*i; temp_v += v[dot]*i; cout <<temp_v<<" "<<temp_w<<endl; DFS(dot+1); temp_w -=w[dot]*i; temp_v -= v[dot]*i; } }}int main(){ cin >>N>>M; for(int i = 1 ; i<=N;i++) cin>>w[i]>>v[i]; //输如数据; for(int i = 1;i<=N;i++) rest_V[0]+=v[i]; for(int i =1;i<=N;i++) rest_V[i] =rest_V[i-1] -v[i];// for(int i = 0;i<=N;i++)// cout <<rest_V[i]<<" ";// cout <<endl; DFS(1); cout <<MAX_v<<endl; return 0;}
阅读全文
0 0
- 回溯--深度优先搜索(01背包)
- hud1010回溯深度优先搜索
- 回溯法--深度优先搜索
- 01背包之深度优先搜索法
- 背包问题(深度优先搜索解法)
- 回溯--深度优先搜索(数字n的组合数)
- 回溯法实例-深度优先搜索
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- 浅谈回溯与深度优先搜索
- map任务和reduce任务个数如何计算
- 当2000万多头猪联接上网,会发生什么
- 蓝桥杯-包子凑数(完全背包)
- Windows下安装python2和python3双版本
- Hbase深入学习
- 回溯--深度优先搜索(01背包)
- Spark简介
- 特斯拉首款电动卡车发布;自媒体侵权美团点评被判赔10万;贾跃亭辞任酷派董事长丨价值早报
- Banner+ListView
- 设置坐标轴刻度偏移量和刻度文本(tics text)加粗--gnuplot
- XML
- Java反射包Method类学习
- 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)
- Form表单多文件上传(H5和Android && Java后台)