吃货如何理解01背包问题

背包问题

image

先从栗子出发,你是一个有理想的吃货,你的肚子只能容纳500g 的食物,为了保证你得到的价值(营养)最大化,有以下几份食物可以选择

食物 质量/weight (100g) 价值/value(10g)
米饭 2 4
黄瓜 1 5
西红柿 1 8
牛肉 3 10

动动吃货的小脑筋,就知道,营养价值最大化的选择是
牛肉+黄瓜+西红柿 共 23(10g)营养!
可是该怎么使用程序计算出答案呢?


image

思路

肚子的资源有限,对每一种食物有两种选择:吃或者不吃。
判断的依据有两点:

(1)肚子能否装得下食物?

(2)吃他的价值,是否比不吃他的价值大?大则吃下,不大则不吃。

假设d(i,w)表示肚子剩w(g)时,有 i 样食物可供选择,我们能得到的最大价值。i 表示第 i 样食物。我们需要求的是d(4,5)

根据上面的逻辑(1)

  • 如果肚子装不下,因为食物i没装进去,那么d(i,w) = d(i-1,w)

  • 肚子装得下,那我需要判断 [不放] d(i-1,w) 和 [放] d(i-1,w-w[i])+v[i] 谁大。

结合上面两条规律,我们得到:

状态转移方程式

d(i, w)=max{ d(i-1, w), d(i-1,w-w[i]) + v[i] }

我们给每样食物加上序号

image







假如我们考虑吃或不吃从下向上按照序号顺序 4,3,2,1

d(4,5)表示只有牛肉、西红柿、黄瓜、米饭可以选择时,能得到的最大价值。如果我知道d(3,5)和d(3,2),我就能得到d(4,5)

d(4 , 5)=max{ d(3,5) , d(3,5-3) }=max{ d(3,5) , d(3,2) + 10}

d(4,5)表示只有西红柿、黄瓜、米饭可以选择时,能得到的最大价值。如果我知道d(2,5)和d(2,4),我就能得到d(3,5)

d(3 , 5)=max{d(2,5) , d(2,4)}

按照上面的往下分解,最终都会指向d(0,w)~逻辑如下图:

image

d(0,w)代表选 0 件物品的放入背包容量为 w 的背包的最大价值,所以为 0。d(i,0)代表选 i 件物品放入背包容量为 0 的背包的最大价值,也为 0。

将树图的d值继续整理得到最优价值表

image







    var value = [5, 8, 4, 10],
        size = [1, 1, 2, 3],
        d = [],
        n = 4,
        C = 5;
    //初始化数组
    for (var k = 0; k <= n; ++k) {
        d[k] = [];
    }
    for (var i = 0; i <= n; ++i) {
        for (var w = 0; w <= C; ++w) {
            d[i][w] = (i == 0) ? 0 : d[i - 1][w];
            if (i > 0 && w >= size[i - 1])
                d[i][w] = Math.max(d[i - 1][w], d[i - 1][w - size[i - 1]] + value[i - 1]);
        }
    }
    
     console.log(d[4][5])//23

总结

01背包问题的这种解法让我感受到了递归的强大,将大问题转换成小问题,然后得到小问题的答案向上求解!

2. 例题

链接:https://www.nowcoder.com/questionTerminal/9ba85699e2824bc29166c92561da77fa
来源:牛客网
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。

3. 资料

动态规划之背包问题(一)

动态规划之01背包问题--表格思路来源

通过金矿模型介绍动态规划

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Lesson 11excuse[ik'skju:z] v.原谅2me[mi:,mi] pron.我(宾格)3yes...
    造物家英语阅读 1,211评论 0 0
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,755评论 0 6
  • 你的坦诚,或许正是我无望的守候 2017年,我还想讲巴旦木的故事。 巴旦木小姐与树莓先生的故事。 结局不算美好,但...
    笑的像颗爆米花阅读 392评论 0 0
  • 这是同学前几日带着幼儿园的老师及女儿到桂林旅游,带回来给小孩的礼物。小孩甚是喜欢,今日早上,大家约去生态公...
    学着努力8e8o阅读 141评论 0 1
  • 在vue.js实例化之后再执行datetimepicker的选择器操作。不然无效。最好在yii activeFor...
    JustFantasy阅读 3,895评论 0 0