文章目录

  • 1. 问题描述
  • 2. 回溯解决思路

1. 问题描述

0-1背包非常经典,很多场景都可以抽象成这个问题。经典解法是动态规划,回溯简单但没有那么高效。

  • 有一个背包,背包总的承载重量是 W kg。现有n个物品,每个物品重量不等,并且不可分割。
  • 选择几件物品,装到背包中。在不超过背包所能装载重量的前提下,如何让背包中物品总重量最大?
  • 物品是不可分割的,要么装要么不装,所以叫 0-1背包问题。

2. 回溯解决思路

  • 对于每个物品来说,都有两种选择,装进背包或者不装进背包。
  • 对于n个物品来说,总的装法就有 2n 种,去掉总重量超过 W kg的,从剩下的装法中选择总重量最接近 W kg的。不过,我们如何才能不重复地穷举出这 2n 种装法呢?

可以用回溯方法。

  • 把物品依次排列,整个问题就分解为了n个阶段,每个阶段对应一个物品怎么选择。
  • 先对第一个物品进行处理,选择装进去或者不装进去,然后再递归地处理剩下的物品。
  • 当发现已经选择的物品的重量超过 W kg之后,就停止继续探测剩下的物品(搜索剪枝技巧)。
/*** @description: 0-1背包--回溯应用* @author: michael ming* @date: 2019/7/9 1:13* @modified by: */
#include <iostream>
#define MaxWeight 76   //背包承载极限
using namespace std;
void fill(int i, int curWeight, int *bag, int N, int &maxweightinbag)
{if(curWeight == MaxWeight || i == N)//到达极限了,或者考察完所有物品了{if(curWeight > maxweightinbag)maxweightinbag = curWeight;//记录历史最大装载量return;}fill(i+1,curWeight,bag,N,maxweightinbag);//不选择当前i物品,cw不更新if(curWeight+bag[i] <= MaxWeight)//选择当前i物品,cw更新{//没有达到极限,继续装fill(i+1,curWeight+bag[i],bag,N,maxweightinbag);}
}
int main()
{const int N = 4;int bag[N] = {15,6,40,21};
//    int bag[N] = {1,2,3,4};int maxweightinbag = 0;fill(0,0,bag,N,maxweightinbag);cout << "最大可装进背包的重量是:" << maxweightinbag;return 0;
}

升级版:
每个物品对应着一种价值,求不超过背包载重极限,可装入背包的最大总价值。(在上面程序里稍加修改即可)

/*** @description: * @author: michael ming* @date: 2019/7/11 20:42* @modified by: */#include <iostream>
#define MaxWeight 50   //背包承载极限
using namespace std;
void fill(int i, int curWeight, int curValue, int *bag,int *value, int N, int &weightinbag, int &maxValue)
{if(curWeight == MaxWeight || i == N)//到达极限了,或者考察完所有物品了{if(curValue > maxValue){maxValue = curValue;//记录历史最大价值weightinbag = curWeight;//记录最大价值对应的重量}return;}fill(i+1,curWeight,curValue,bag,value,N,weightinbag,maxValue);//不选择当前i物品,cw,cv不更新if(curWeight+bag[i] <= MaxWeight)//选择当前i物品,cw,cv更新{//没有达到极限,继续装fill(i+1,curWeight+bag[i],curValue+value[i],bag,value,N,weightinbag,maxValue);}
}
int main()
{const int N = 4;int bag[N] = {15,6,40,21};int value[N] = {1,2,3,4};int weightinbag = 0, maxValue = 0;fill(0,0,0,bag,value,N,weightinbag,maxValue);cout << "最大可装进背包的最大价值是:" << maxValue<< " ,对应重量是: " << weightinbag;return 0;
}

回溯应用-- 0-1背包问题相关推荐

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

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

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

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

  3. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

  4. 回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)

    问题:0/1背包问题 例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量.背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1 ...

  5. 分枝定界法解0/1背包问题

    分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...

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

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

  7. 令人头疼的背包九讲(1)0/1背包问题

    点击上方"Jerry的算法和NLP",选择"星标"公众号       重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程 ...

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

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

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

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

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

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

最新文章

  1. 戈峻:英特尔推动嵌入式教育 意在双赢
  2. win8.1系统用户看过来,0x80004005错误解决大法!
  3. 德国公司宣布研制出新冠病毒快速检测试剂 2.5小时出结果
  4. win10,pip更新后,Spyder打不开
  5. 求杨辉三角的前n行数据_LeetCode算法第118题:杨辉三角
  6. android Glide简单使用
  7. 牛客 - 点对最大值(树的直径)
  8. 爬虫 spider06——解析数据
  9. C#实现Combobox自动匹配字符
  10. axios (get post请求、头部参数添加)傻瓜式入门axios
  11. php毕设,php毕设
  12. python循环for...in_python循环while和forin实例
  13. 【李宏毅机器学习】Why Deep Learning(p15) 学习笔记
  14. 计算机系统-理论-内存读取/大端法小端法
  15. log 日志 php tp5,TP5自定义日志记录到文件方法
  16. 第 7 章 Neutron - 075 - 为 Neutron 准备物理基础设施(I)
  17. js系列之每天一练成长录之一
  18. python怎么画小海龟_python画图之“小海龟”turtle
  19. [kuangbin带你飞]专题四 最短路练习
  20. 手机计算机隐藏图标,怎么隐藏图标-隐藏小米手机桌面图标文字,只需一小段代码...

热门文章

  1. 笔试常见的智力题(附答案)
  2. python的三大错误类型_学习Python时要避免的三个错误
  3. s5pv210——时钟系统
  4. makefile / CMake
  5. SAP中货源清单创建的几种方法
  6. python 中main函数总结
  7. VMWare serve 2.0 进入 RHEL Linux rescue模式
  8. 非常经典的C字符串函数的实现
  9. 控制台中使用cstring和string
  10. 时间同步绝对是一个大问题