动态规划之:背包算法最简单的理解


1.常用的算法设计技术:贪心算法,分治和动态规划。

贪心:寻找局部最优,代替全局最优。比如说不带权的区间调度问题,每次选取最早完成时间的作业。找到贪心的标准是最重要的,这种算法设计技术,需要对算法的有效性进行验证,贪心常常不一定有效。

分治:简而言之,分而治之。将一个复杂的大问题分解为若干个子问题求解;

动态规划:将一个复杂问题分解问若干子问题,这些子问题之间有关联和交集,避免重复计算。可以先来看一个简单的更容易理解的例子:走楼梯问题。

欢迎查看相关问题:动态规划之:防止重复计算【经典问题:走楼梯问题,斐波那数列】 【完成】

背包问题是各个领域的经典问题之一,今天就总结下,通俗易懂的帮助大家快速理解该算法。

背包问题:有N件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

定义:OPT(i,w)为在1,2,3,.......,i 这么多件物品中重量和小余w的最优解;

i=0,1,2,3,4,5

wi:  w1,w2,w3,w4,w5-------------> 1,2,5,6,7

w: 11  书包容量(重量)不能超过w.

则:

(1). OPT(i,w)=0           if  i<=0

(2). OPT(i,w)=OPT(i-1,w)             if wi>w 【第i个重量超过了总重量W的限制】

(3).OPT(i,w)=max{OPT(i-1,w) ,   Vi+OPT(i-1,w-wi) }    otherwise

上述递归式很重要,如下让我们手工操作一遍,感受下这个过程,请自己画表格,填充试一试,加深理解:

上面第一行为0,1,2,.........,10,11。意思为总重量限制;

第一列指的是包含物品序号的集合;

在对应的物品序列集合和总重量限制下,白色部分红色的0为填充的值,即当总重量为0限制【第二列列头0】或者物品序号集合为空集合{  }【第二行的行头】时候,最大的价值OPT为红色部分所示的0。

下面根据如下的公式计算下表:

(1). OPT(i,w)=0           if  i<=0

(2). OPT(i,w)=OPT(i-1,w)             if wi>w 【第i个重量超过了总重量W的限制】

(3).OPT(i,w)=max{OPT(i-1,w) ,  Vi+OPT(i-1,w-wi) }      otherwise

继续按照递推公式填满下表:

例如计算图标中的红色值是18,过程如下:

OPT(i,w)=OPT(3,5),此时Wi=W3=5>5不成立【Wi>W不成立】,

OPT(i,w)==max{OPT(2,5),18+OPT(2 ,5-5)}==max{OPT(2,5), 18+OPT(2,0)}==max{7,18}=18;

算法描述:

            Input: n,     W1,W2,    ............ ,Wn,  V1,.......Vnfor w=0  to  WM[0,w]=0;for i=1 to nfor w=1  to  Wif(wi>w)M[i,w]=M[i-1, w];elseM[i, w]=max{M[i-1, w],vi+M[i-1, w-wi]}return M[n,W];

此算法的时间复杂度:O(nW)

java代码实现:请理解上面的表格或者递推公式。下面代码复制到java环境改下对应包名即可运行。

package com.mytest.test001;public class knapspack {/*** 有N件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是v[i]。* 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。*/public static void main(String[] args) {int w=11;//背包装入的总重量不能超过该值,使得总价值最大int n=5;//五个物品int[] value={1,6,18,22,28};//对应物品的价值int[] weight={1,2,5,6,7};//对应每个品的重量System.out.println("所得结果:"+findMaxValue(w,n,weight,value));}private static int findMaxValue(int w,int n, int[] weight, int[] value) {int[][]max=new int[n+1][w+1];for(int i=0;i<=w;i++)//M[n,W]max[0][i]=0;for(int j=1;j<=n;j++)for(int k=1;k<=w;k++)if(weight[j-1]>k){//第j个物品对应重量的下标减1,从0开始。max[j][k]=max[j-1][k];//当加入的一个物品重量大于k,这个物品一定不能选}else{int a=max[j-1][k];//不选第j个物品int b=value[j-1]+max[j-1][k-weight[j-1]];//可以选第j个物品,选择这个物品max[j][k]=a>b ? a:b;//选择第j个和不选第j个物品,那个大,返回哪个;}//遍历数组结果,打印出来看看for (int[] is : max) {for (int i : is) {System.out.print(i+"  ");}System.out.println();}return max[n][w];}}

运行效果图:

【备注】:显然以上算法的时间复杂度为O(nw)。不是多项式时间内的解法。

【备注】:每个物品有多件,等其他非简单背包问题都可以转化为类似的简单背包问题。

【备注】:存在O(n)的近似算法。

动态规划之:让你轻松理解背包算法相关推荐

  1. a*算法的优缺点_轻松理解机器学习算法-朴素贝叶斯

    1.预备知识 贝叶斯定理(Bayes' theorem)是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关.通常事件A在事件B发生的条件下的概率,与事件B在事件A发生的条件下的概率是不一 ...

  2. 背包算法轻松搞定——01背包算法、部分背包算法

    这篇文章过程讲得很详细,一文搞懂(点击看原文) 不懂之前觉得很难理解,觉得很复杂,其实没有必要.因为只要懂动态规划就可以很轻松搞定0-1背包算法(部分背包算法更简单,排序即可).之前看了很多篇文章都觉 ...

  3. 看动画轻松理解“递归”与“动态规划”

    作者 | 程序员小吴 来源 | 五分钟学算法 在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知 ...

  4. c 递归下降识别程序_看动画轻松理解递归与动态规划

    在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点. 程序员小吴打算使用动画的形式来帮助理解 ...

  5. 看图轻松理解数据结构与算法系列(合并排序)

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  6. 动态规划 背包算法 JS实现

    昨天面试时遇到一个背包算法的题目,和传统的背包稍有不同,是给定背包的容量和各种物品的重量,要求放入物品的总质量尽可能接近背包的容量并小于背包的容量,且放入的物品数目最少. 以下是我自己根据理解编写出来 ...

  7. 看图轻松理解数据结构与算法系列(2-3树)

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  8. 轻松理解20种最常用的AI算法

    常用AI算法知多少?他们的主要特征是什么?分别用在什么场景? 如何用1-3句话,让小白也能充分理解各算法? 本文梳理了20中常用AI算法极其简明解释,快来一起挑战"算法之王"呀! ...

  9. 计算机视觉新手如何轻松地理解SSD算法?

    CV_01 SSD算法的简单理解(入门级别) 一. 写这篇博文的初衷 其实在很多论坛也好,贴吧也罢已经有了很多关于SSD算法的剖析与理解,但大部分都比较学术和深奥,博主在初学的时候也是遇到了不少难以理 ...

最新文章

  1. 台积电将开始量产 iPhone 8 A11 芯片 10纳米工艺
  2. 火狐产品主管称:不值得开发Windows RT浏览器
  3. stand up meeting 1/14/2016
  4. 每日一皮:一个名字打败对手的经典案例...
  5. java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...
  6. Android入门(12)| 数据持久化
  7. 课题开题报告范文样本_成都汽车职业技术学校举行 2020年省、市、区课题开题报告会...
  8. Spring Boot教程
  9. SSL ×××和IPSec的主要区别
  10. 羞,Spring Bean 初始化/销毁竟然有这么多姿势
  11. 【操作指导】安捷伦数据采集器开机自检/通讯接口设置说明
  12. 苹果应用商店反垄断案败诉,市值蒸发500多亿美元;脸书杠上了土耳其政府;Nutanix 扩展多云产品组合……...
  13. 实现 酷狗音乐 歌词播放效果
  14. Java加密算法—凯撒加密实现以及暴力破解
  15. pip高阶玩法,让python模块安装飞起来
  16. Linux操作提示:“Cant open file for writing”或“operation not permitted”的解决办法
  17. VS2017设置DLL和LIB的输出目录
  18. 2018年中小学计算机培训,2018年中小学教师全员培训资料.doc
  19. 计算机控制在无人车中的应用,汽车无人驾驶技术的探讨
  20. 《论文阅读》Are Emojis Predictable?

热门文章

  1. 如燕盘旋而来的思念--永远的张雨生
  2. windows11 Jmeter安装教程
  3. 科目记账中事务控制问题处理一例(定制应用,无参考价值)
  4. 今日头条怎么赚钱,今日头条个人怎么赚钱
  5. Java异步调用的几种方式
  6. 天鹅肉真被癞蛤蟆吃去了
  7. 联想触摸板只能单击,二指三指失效
  8. win10家庭版调出组策略_从零开始——六:Windows系统的家庭版、专业版有何区别?...
  9. u盘乱码怎么做?这些正确做法你知道吗?
  10. 半入耳式蓝牙耳机哪个好用?高端半入耳式蓝牙耳机推荐