重写0-1背包问题的回溯法,使算法能输出最优解

样例:
4 7
3 9
5 10
2 7
1 4
输出:
20


分析:构建二叉树,每个物品只有拿和不拿两种情况, 时间复杂度为O(2^n)。

不难, 深搜模板, 笔者写了两种代码, 第一种可以输出搜索路径, 第二种是简化版的,只能输出最大值。


代码一(搜索路径)

#include<bits/stdc++.h>
#define MAXLENGTH 10
using namespace std;int c, n, weight[MAXLENGTH], value[MAXLENGTH];  //背包容量、物品数量、物品重量、物品价值
int currentWeight = 0, currentValue = 0;  //当前重量和价值
int bestAnswer[MAXLENGTH], bestPrice = 0;  //最优价值
int bp;     //最终的最大价值
int bA[MAXLENGTH];  //最终的最大价值
int times = 0;
int number = 0;        //可行路径个数void Print();
void Backtracking(int i); int main() {int i; cin>>n>>c;for(i = 1; i <= n; i++) cin>>weight[i]>>value[i];Backtracking(1);for(i =1; i < n; i++) cout << bA[i] << ',';cout << bA[i] << '\n' << bp; return 0;
} void Print() {cout << "路径:" << ++number << "   ";int i; for(i = 1; i < n; i++) cout << bestAnswer[i] << ',';cout << bestAnswer[i] << "价值为:" << bestPrice << '\n';
}void Backtracking(int i) {//递归一次节点数增加times++;if(i>n) {Print();if(bestPrice > bp) {bp = bestPrice;for(int j = 1; j <= n; j++) bA[j] = bestAnswer[j];}return;} //当装入第i个物品还没有达到背包的最大质量时if(currentWeight + weight[i] <= c) {//装入第i个物品currentWeight += weight[i];//分治为0和1bestAnswer[i] = 1;bestPrice += value[i];//搜索左子树Backtracking(i+1);//为其他情况恢复数据currentWeight -= weight[i];bestPrice -= value[i]; } //当前节点重新开始,搜索右子树bestAnswer[i] = 0;Backtracking(i+1);
}

代码二,简化版,只能输出最大值

#include<bits/stdc++.h>
#define MAXLENGTH 10
using namespace std;int c, n, weight[MAXLENGTH], value[MAXLENGTH];  //背包容量、物品数量、物品重量、物品价值
int currentWeight = 0, currentValue = 0;  //当前重量和价值
int bestPrice = 0; //最优价值
int bp;     //最终的最大价值void Print();
void Backtracking(int i); int main() {int i; cin>>n>>c;for(i = 1; i <= n; i++) cin>>weight[i]>>value[i];Backtracking(1);cout << bp; return 0;
} void Backtracking(int i) {//递归一次节点数增加if(i>n) {if(bestPrice > bp) bp = bestPrice;return;} //当装入第i个物品还没有达到背包的最大质量时if(currentWeight + weight[i] <= c) {//装入第i个物品currentWeight += weight[i];//分治为0和1bestPrice += value[i];//搜索左子树Backtracking(i+1);//为其他情况恢复数据currentWeight -= weight[i];bestPrice -= value[i]; } //当前节点重新开始,搜索右子树Backtracking(i+1);
}

重写0-1背包问题的回溯法,使算法能输出最优解相关推荐

  1. (转)回溯法-算法框架及基础

    好,顶 原文地址:(转)回溯法-算法框架及基础作者:jinyang6655 转自http://lilongfei1030.blog.163.com/blog/static/86015282008720 ...

  2. 从0-1背包问题学习回溯法、分支界限法、动态规划

    一.0-1背包问题的描述 下面将使用回溯法.分支界限法.动态规划法来分析和解决此问题. 二.回溯法 (1)算法步骤 (2)代码如下(没有裁剪函数): 用i和n来判断结束与否,是因为解空间结构是完全二叉 ...

  3. python 回溯法 01背包问题_回溯法解决01背包问题

    回溯法是一个既带有系统性又带有跳跃性的搜索算法. 它在包含问题的所有解的解空间树中按照 深度优先的策略, 从根节点出发搜索解空间树. 算法搜索至解空间树的任一节点时, 总是先判断 该节点是否肯定不包含 ...

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

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

  5. python 回溯法 01背包问题_回溯法-01背包问题

    一.问题描述 给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i].现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大 二 ...

  6. 【回溯法】01 - 回溯法的算法框架

    回溯法以深度优先策略搜索解空间树. 1. 用回溯法解题时,要明确定义问题的解空间树. 2. 通常将解空间树组织成树或图的形式. 回溯法求解问题的所有解时,要回溯到根,且根节点的所有子树都已被搜索到才结 ...

  7. 回溯法——回溯法的算法思想

    参考了一篇写的较好的博客 [回溯算法] 五大常用算法之回溯法_GoRustNeverStop的博客-CSDN博客_回溯算法 简单来说,回溯法是一个在所有可能性中寻找最优解的问题,但与遍历所有路径的全遍 ...

  8. python 回溯法 01背包问题_Python回溯法解决01背包问题

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. 回溯法经典算法 求集合中所有的子集

    今天我们来看一下子集的问题. 题目描述:给定一个任意集合A,集合的长度为Length,让你打印出这个集合中所包含的所有子集. 题目分析:此问题实际上也是一个遍历树的问题,进行遍历每一个子元素,再进入下 ...

最新文章

  1. fastJson,gosn使用小结
  2. php curl 防止采集,php多线程采集网页的解决办法 curl多线程采集
  3. 红外摄像机的功率究竟有多大
  4. Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上
  5. mysql使用游标的访问过程_mysql存储过程中使用游标的实例_MySQL
  6. 智慧交通day02-车流量检测实现05:卡尔曼滤波器实践(小车模型)
  7. iar 连接linux开发板,LED裸机程序(IAR)
  8. ES6新特性_ES6模块化介绍_优势_以及产品---JavaScript_ECMAScript_ES6-ES11新特性工作笔记041
  9. Golang json 解析与生成
  10. linux上apache目录在哪,Linux下Apache目录明细
  11. thinkphp 关联模型配置代码
  12. 【转】VBScript-RegExp对象的详细用法
  13. 计算机与英语教学的论文开题报告,英语教学论文开题报告
  14. WINRM实现端口复用后门
  15. 透过案例--了解循环栅栏
  16. Twd轉php_5 TWD to PHP Currency Converter - 新台币 菲律宾比索 汇率兑换
  17. 深度学习预测酶活性参数提升酶约束模型构建从头环境搭建
  18. QQ相关(一)【导出所有QQ好友】
  19. windows7微软官方_Microsoft Windows 7 | 第1部分
  20. 血色冲锋队洛谷P1332(福建省历届夏令营)

热门文章

  1. 音视频技术开发周刊 | 134
  2. LiveVideoStack线上分享第五季(三):新一代直播传输协议SRT
  3. 音视频技术开发周刊 77期
  4. 企业微信万亿级日志检索系统
  5. Serverless——前端的3.0时代
  6. 长文 | 腾讯提出 AI For FEW 构想,呼吁人工智能为地球思考
  7. Fashion-MNIST 一周年 | Google NIPS最爱,还登上了Science
  8. nginx的请求接收流程(二)
  9. RTMP直播应用与延时分析
  10. libxml2如何解析xml格式的字符串