问题简介

输入:n种物品和一个背包

物品i的重量是wi,价值为vi

背包的容量是C

输出:装入背包的物品

优化目标是:装入背包的物品总价值最大

优化子结构

设(x1,x2,x3…xn)是0-1背包问题的一个最优解。

如果x1=1,那么(x2,x3,x4,x5…xn)是以下子问题的最优解:

如果x1 =0:则 (x2, …, xn) 是以下子问题的最优解

递归关系

设m(i, j)为背包问题的最优值,这里背包容量为j,可选物品为i, i+1, …, n,

有如下递归关系:

如果i<n时

i=n时

优化子结构

表格举例

给出如下三个物品,背包容量为5:

构造下列表格:

其中m[i][j]表示放入0-i的物品,背包容量为j的价值。

现在考虑放入id为0的物品,因为物品重量为1,所以在背包容量为0时无法放入,其他情况下都可以放入物品0,所以表格变为:

第二行时,要考虑放入0,1两个物品了,所以需要用到我们的迭代公式,

例如m[1][0],此时的背包容量为0,则什么都放不下为0,

而m[1][1]时,j<w1(物品1的重量为2),所以此时m[1][1]=m[0][1]=6;

再例如m[1][2]时,j>w1,此时m[1][2]=max{m[0][2],m[0][0]+v2}=max{6,0+10}=10

按照这个理论挨个填写,得到结果如下:


此时的m[2][5]是最佳的价值,但是如何求出最优解呢?

我们回顾m[2][5]的得到过程,m[2][5]=m[1][2]+v2=m[0][0]+v1=v1+v2,因此最佳解为放入物品1和物品2。

具体在算法中如何实现呢?我们选择利用上述的二维数组进行逆推,从最大可装入价值处逆推。

最大可装入价值处容量为5,减去最后放入的物品2的重量,得到5-3=2,我们跳转到去掉物品2,容量为2处,也就是m[1][2]处,此时装入了物品1,而1的重量为2,去掉物品1,和容量2,剩下m[0][0],此时容量已经变为0,算法结束,也就是装入了物品1和物品2。

具体代码如下:

#include<iostream>
#include<stdio.h>
#define N 6     //物品的个数
#define W 21    //背包容量int B[N][W] = { 0 };
int w[6] = { 0,2,3,4,5,9 };    //物品重量
int v[6] = { 0,3,4,5,8,10 };//物品价值void knapsack()
{int k; //第K个物品int C;   //背包剩余重量//填表for (k = 1; k < N; k++){for (C = 1; C < W; C++){if (w[k] > C)                                //第k件物品放不进去 此时背包的价值 = 判断完上一件物品之后背包的价值{B[k][C] = B[k - 1][C];}else{int value1 = B[k - 1][C - w[k]] + v[k];   //放入第k件物品后 背包总价值 = 先给这件物品留出空间,剩余的背包大小能装进的最大价值 + 这件物品的价值int value2 = B[k - 1][C];              //不放入第k件物品 背包总价值 = 不用给这件物品留出空间,当前背包大小能装进的最大价值(就是判断完上一件物品之后背包的价值)if (value1 > value2){B[k][C] = value1;}else{B[k][C] = value2;if (value1 < value2)printf("k=%d C=%d\n", k, C);}}}}
}
int main()
{knapsack();for (int i = 0; i < N; i++){for (int j = 0; j < W; j++){printf("%4d ", B[i][j]);}printf("\n\n");}system("pause");
}

(代码摘自:https://hanquan.blog.csdn.net/article/details/89456491)

动态规划之0-1背包问题(思路详解+表格演示过程+最优解打印方法+详细代码)相关推荐

  1. Pinterest 3.0 for iOS设计过程——升级iOS7设计思路详解

    Pinterest 3.0 for iOS设计过程--升级iOS7设计思路详解 时间2013-12-11 11:39:31  苹果开发中文站 原文  http://www.cocoachina.com ...

  2. 【直播】陈安东,但扬:CNN模型搭建、训练以及LSTM模型思路详解

    CNN模型搭建.训练以及LSTM模型思路详解 目前 Datawhale第24期组队学习 正在如火如荼的进行中.为了大家更好的学习"零基础入门语音识别(食物声音识别)"的课程设计者 ...

  3. vuepdf转换html,Vue网页html转换PDF(最低兼容ie10)的思路详解

    Vue网页html转换PDF(最低兼容ie10)的思路详解 发布时间:2020-10-16 13:05:09 来源:脚本之家 阅读:95 作者:冷藏封 HTML转PDF: 1.页面底层实现--Vue: ...

  4. python正则表达式提取数字比较好_python正则表达式从字符串中提取数字的思路详解...

    python从字符串中提取数字 使用正则表达式,用法如下: ## 总结 ## ^ 匹配字符串的开始. ## $ 匹配字符串的结尾. ## \b 匹配一个单词的边界. ## \d 匹配任意数字. ## ...

  5. python处理excel大数据-Python实现大数据收集至excel的思路详解

    一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...

  6. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  7. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  8. FPGA串口(UART)通信协议制定与设计思路详解示例

    串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...

  9. php数组10000分割1000_PHP切割整数工具类似微信红包金额分配的思路详解

    主要代码:NumberSlicing.php 思路:将数字按精度放大倍数,比如切割数字1,切割的份数是10,精度是0.01,则将1放大100 X 10倍,然后再来对加了1000倍权重后的值进行切割.切 ...

最新文章

  1. java操练之求两数最大公约数的两种算法思路
  2. 组织应该采用集中式发电机吗?
  3. 任务01——谈谈对参与工作室的预期
  4. 基于Netty的http服务器
  5. 新开了微博,小伙伴们可以关注下哦
  6. 95-235-070-源码-task-OneInputStreamTask
  7. linux kernel基本构成的内容有下列哪些项_Linux下逻辑地址-线性地址-物理地址详解...
  8. python在web可以开发吗_怎么用python进行web开发
  9. 810B - 牛人是如何工作的
  10. Linux用户登录日志查询
  11. 浅谈web架构之架构设计
  12. NSMethodSignature, NSInvocation源码分析
  13. Silverlight 2 又来了两本新书
  14. 在家自学html,怎样在家自学英语口语
  15. 『光纤交换机级联设置 』光纤跳线及光纤交换机端口级联类型
  16. NAS信令学习笔记 ——GUTI reallocation过程
  17. NCCL无root权限编译安装
  18. 熊写代码这三年:阅读写作与技术成长
  19. CSDN 2021-2022年微博情感数据分析
  20. huaweizip安装包_华为安卓安装包无法解压为什么

热门文章

  1. 一阶电路暂态响应的结果分析。_第八讲 线性电路的过渡过程分析二
  2. 一阶电路暂态响应的结果分析。_第七讲 线性电路的过渡过程分析一
  3. 会计信息质量可靠性的案例_会计信息可靠性的分析
  4. UE4.27 基于composure的虚拟制片
  5. android 802.1x 认证,802.1X认证基础
  6. javaweb基于JSP+Servlet开发水费管理系统+论文 大作业 毕业设计
  7. 扫 雷 小 游 戏
  8. P1757 通天之分组背包题解
  9. 推荐几个网站 - (可视化、博客、社区、学习网站)
  10. HECO使用docker部署单节点的开发网