优化方法: 
剪枝一:可以进行剪枝,因为很多情况是没有意义的,当重量大于背包容量的时候,没有必要对剩下的物品再来决策了。

剪枝二:将剩下的所有物品都选取其总价值也没有目前已经求得的方案的价值还大的话,也可以返回。

#include <stdio.h>#define M 3
#define ERROR 0
#define OK 1typedef int status;
int curweight=0;  //存放当前物品的总重量
int curvalue=0;
int limitweight;  //背包最多存放多少物品
int maxValue=0;      //存放最大价值
int option[M];  //定义物品是否被选中
int op[M];     //定义物品临时被选与否
struct node{int weight;int value;
}Node[M],node;  status condition(int i){//计算上界int remain_capacity = limitweight - curweight;//  int  b = remain_capacity;//按单位重量的价值  递减序 装入物品while(i<=M && Node[i].weight<=remain_capacity){remain_capacity-=Node[i].weight;// b+=p[i];i++;}return remain_capacity;
}//排序  按性价比
void  sort(){int i,j;for(i=0;i<M-1;i++)for(j=i+1;j<M;j++){if((Node[i].value/(float)Node[i].weight)<(Node[j].value/(float)Node[j].weight)){node=Node[i];Node[i]=Node[j];Node[j]=node;}}
}//定义上界函数
int upper(int i){int  cleft = limitweight - curweight; //剩余容量int b = curvalue;//以物品单位重量价值递减序装入物品while ( i<= M && Node[i].weight<= cleft) {cleft -= Node[i].weight;b += Node[i].value;i++;}//装满背包if( i<=M )  b+= Node[i].weight/(float)Node[i].value*cleft;return b;
}//回溯主要方法
void backtrack(int i){int j;if(i>=M){if(curweight<=limitweight &&curvalue>maxValue){  maxValue=curvalue;for(j=0;j<M;j++){option[j]=op[j];}}return;}else{if((curweight+Node[i].weight)<=limitweight){  //进入左子树op[i]=1;  //当物品被选上时curweight+=Node[i].weight;curvalue+=Node[i].value;backtrack(i+1); curweight-=Node[i].weight;curvalue-=Node[i].value;}if(upper(i)>maxValue){  //进入佑子树op[i]=0;  //当物品没被选上时backtrack(i+1);            }}
}//进行结果的输出
void putout(){int sumv=0,sumw=0,i;printf("选中物品的重量 价值分别为:\n");for(i=0;i<M;i++){if(option[i]){printf("%d %d\n",Node[i].weight,Node[i].value);sumw+=Node[i].weight;sumv+=Node[i].value;}}printf("总重量为:%d\n",sumw);printf("总价值为:%d\n",sumv);
}int main(){int i;printf("请输入背包容积:\n");scanf("%d",&limitweight);for(i=0;i<M;i++){printf("请输入第%d件物品的重量和价值",i+1);scanf("%d%d",&Node[i].weight,&Node[i].value);fflush(stdin);}sort();backtrack(0);putout();return 0;
}

回溯法求解0 1背包的优化相关推荐

  1. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  2. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

  3. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  4. 回溯法求解N皇后问题及其时间复杂度分析

    回溯法求解N皇后问题及其时间复杂度分析 一.回溯法简介 1. 什么是回溯法? 2. 回溯法的时间复杂度分析 蒙特卡罗方法 蒙特卡罗方法在回溯法求解时间复杂度中的应用 二.回溯法求解N皇后问题 1. 回 ...

  5. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  6. 回溯法求解0-1背包问题

    回溯法求解0-1背包问题时比较随机序列和按 v/w 降序排列的算法 问题描述: 针对0-1背包问题,尝试用回溯法. 物品总数N=10,背包容量 C=26, 物品的重量数组为w={7,3,10,12,1 ...

  7. 01背包问题【回溯法求解】通俗易懂,适合小白

    本人此时还是一名研一的小菜鸡,刚学会了这个算法的基本概念,来总结一下,谁知道今后的我再看到这篇自己写的博客的时候会不会笑出来,哈哈哈哈哈哈哈哈,所以吗,错了的化大佬们评论指正就好了. 还有系列文章动态 ...

  8. 回溯法求解0-1背包问题(细节分析)

    回溯法求解0-1背包问题(细节分析) 论temp数组的必要性和判断cv>bestv的不必要性 回溯法 应用回溯法求解问题时,首先应明确定义问题的解空间,该解空间应至少包含问题的一个最优解.例如, ...

  9. 回溯法解决tsp问题 matlab,回溯法求解tsp问题

    回溯法以这种工作方式递归地在解空间中搜索, 直至找到所 要求的解或解 空间中已无活结点时为止. 回溯法求解 TSP 问题,首先把所有的顶点的访问标志初始化为 0,...... 回溯法求解 TSP 问题 ...

最新文章

  1. 中国式巨婴,到底有多可怕?
  2. eclipse创建python项目提示Project interpreter not specified
  3. 依赖注入之Autofac使用总结
  4. 01,完全,多重,分组
  5. Python 技术篇-百度语音合成SDK接口调用演示
  6. python import xlrd 报错_python读取excel(xlrd)
  7. 职场提醒:面试失败n次以后
  8. 一次使用duplicate创建测试数据库的过程
  9. C#中的深度学习:ML.NET中具有预训练模型的硬币识别
  10. 小程序请求php接口返回错误$HTTP_RAW_POST_DATA is deprecated......
  11. Ubuntu下配置Window CIFS共享
  12. 强化学习算法在京东广告序列推荐场景的应用实践
  13. BodyFusion: Real-time Capture of Human Motion and Surface Geometry Using a Single Depth Camera
  14. 如何在 Web 前端做 3D 音效处理
  15. linux误删除文件恢复
  16. 信号处理中使用IPP库函数的基本设置
  17. 权值衰减和L2正则化傻傻分不清楚?
  18. pikachu~~~CSRF(get,post,token)
  19. 判断两个IP地址(ipv4)是否在同一个网段
  20. rails 查询 where条件用法

热门文章

  1. Qt 提示 error creating ssl context()的一种解决方式
  2. Python SOCKS5 二级代理服务器 实现白名单与网络控制
  3. 输入压缩空间量是分区量吗_都0202年了,对于电脑磁盘的分区、删区、合并区,你还不会?...
  4. 被中华人民共和国第一届职业技能大赛云计算比赛采用的平台是什么样的?
  5. JAVA 逻辑运算符及注意事项
  6. 工具:PsTools-windows问题定位系列小工具
  7. [模板] 快速傅里叶变换(FFT)
  8. 遇到Excel表格有密码怎么办
  9. 《完全用Linux工作,摈弃Windows》 (我收集的比较畅快的文章)
  10. 计算机科学与技术专业师范类,计算机科学与技术专业(师范)简介.PDF