当前位置: 首页 > news >正文

01背包问题

背包问题的递归解决过程如下:

第一步明确思路
在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。

1、建立模型,即求max(V1X1+V2X2+…+VnXn);

2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;

3、寻找递推关系式,面对当前商品有两种可能性:

包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);

由此可以得出递推关系式:

j<w(i) V(i,j)=V(i-1,j)
j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
第二步填表
第三步回溯找到所选商品
背包问题最优解回溯
通过上面的方法可以求出背包问题的最优解,但还不知道这个最优解由哪些商品组成,故要根据最优解回溯找出解的组成,根据填表的原理可以有如下的寻解方式:

V(i,j)=V(i-1,j)时,说明没有选择第i 个商品,则回到V(i-1,j);
V(i,j)=V(i-1,j-w(i))+v(i)时,说明装了第i个商品,该商品是最优解组成的一部分,随后我们得回到装该商品之前,即回到V(i-1,j-w(i));
一直遍历到i=0结束为止,所有解的组成都会找到

http://www.lryc.cn/news/9390.html

相关文章:

  • 14_FreeRTOS二值信号量
  • JavaScript随手笔记---轮播图(点击切换)
  • 机器人学 markdown数学公式常用语法
  • 如何使用 Python 语言来编码和解码 JSON 对象
  • 【蓝桥云课】求正整数的约数个数
  • 刷题记录: wannafly25 E 牛客NC19469 01串 [线段树维护动态dp]
  • 懂九转大肠的微软New Bing 内测申请教程
  • WRAN翻译
  • ROS学习笔记——第二章 ROS通信机制
  • MacOS Pytorch 机器学习环境搭建
  • 项目——博客系统
  • PHP(14)会话技术
  • 对JAVA 中“指针“理解
  • 功率放大器在MEMS微结构模态测试研究中的应用
  • 【算法基础】字典树(Trie树)
  • MyBatis 插件 + 注解轻松实现数据脱敏
  • MySQL优化篇-MySQL压力测试
  • CF43A Football 题解
  • Nginx常用命令及具体应用(Linux系统)
  • 从零实现Web服务器(三):日志优化,压力测试,实战接收HTTP请求,实战响应HTTP请求
  • MFC入门
  • 1、H5+CSS面试题
  • 亚马逊云科技重磅发布《亚马逊云科技汽车行业解决方案》
  • Springboot扩展点之FactoryBean
  • 新库上线 | CnOpenDataA股上市公司交易所监管措施数据
  • 同步辐射XAFS表征方法的应用场景分析
  • 06 antdesign react Anchor 不同页面之间实现锚点
  • mysql调优-内存缓冲池
  • 【LeetCode】每日一题(5)
  • 输入任意多个整数, 把这些数据保存到文件data.txt中.(按ctrl + z)