博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何把背包问题转化成动态规划 01背包 完全背包 多重背包
阅读量:5273 次
发布时间:2019-06-14

本文共 736 字,大约阅读时间需要 2 分钟。

如何把背包问题转化成动态规划

绪言

每当有人看到这样的题目:

有n 种物品(各有一件/都有无限件/有有限件),它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

那个人可能会喊道:

我的妈呀。。。又是背包【哭】

今天我一定要搞懂背包!

这个人,是你,也(就)是我。(dalao们好!)

01背包

这是最基础的背包问题

我们不妨从输入讲起

input

可以用结构体struct

struct str{    int w;    int v;} object[n];

也可以用数组

int v[n],w[n];

为表达方便,以下代码使用数组

solution

这里用一种我从未见过的表达方式:

  用dp[i][j]表示以j为剩余容量,选择性的放入前i个物品的最大价值。

初始化:

  dp[0][j]=dp[i][0]=0;

进入下一步的选择:

  对于每一个物品,你有两个选择:

    容量不足,装不下它:

      此时的价值==前i-1个物品时的价值,即dp[i][j]=dp[i-1][j]

    容量足以装下它,but不一定能达到当前最优价:

      在选与不选中选择一个最优的,即dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};

      其中dp[i-1][j]为不装情况,dp[i-1][j-w[i]]+v[i]为装的情况

这就是递推式了

dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};

Code

 

转载于:https://www.cnblogs.com/send-off-a-friend/p/11299131.html

你可能感兴趣的文章
插入排序
查看>>
hbase
查看>>
七:程序是在何种环境下运行的
查看>>
jmeter聚合报告导出时乱码的解决
查看>>
基于VM10+Win7安装Mac OSX10.11 El Capitan
查看>>
支付宝支付成功,return_url.php返回数据为空解决办法
查看>>
AIX 计算5天前的时间
查看>>
C++到底还能做什么?
查看>>
zabbix4.0监控Nginx1.15.8配置记录
查看>>
js 截取url
查看>>
iOS网络-05-AFNetwoking原理及常用操作
查看>>
Windows实用快捷键
查看>>
[bzoj2179]FFT快速傅立叶_FFT
查看>>
mediawiki的管理与使用
查看>>
hdu 1811 Rank of Tetris(拓扑排序+并查集)
查看>>
ASP的URL重写技术(IIS的ISAPI)[转]
查看>>
PHP---文件上传与下载
查看>>
STL学习笔记序言
查看>>
实例化对象的过程
查看>>
Android几种视频播放方式,VideoView、SurfaceView+MediaPlayer、TextureView+MediaPlayer,以及主流视频播放器开源项目...
查看>>