绝对经典背包九讲完整版
acm中d问题简单入门讲解

ACM暑期集训报告院系:专业:年级:学号:姓名:日期:西南交通大学目录目录 (1)第1章动态规划(dp) (2)1.1 简介 (2)1.2 教师内容 (5)1.3 基本dp——背包问题 (6)1.4若干经典dp及常见优化 (9)1.5类似题目 (10)参考文献 (31)附录1 暑期集训心得体会 (31)第1章动态规划(dp)(标题采用2号黑体居中,下空1行)1.1 简介(标题采用四号黑体,正文内容采用小四号字体,1.5倍行距)在解决问题的时候我们经常遇到这种问题:在多种方式的操作下我们如何得到一个最优的方式让我们得到满意的结果。
这时候我们大多人的思想就是贪心。
不错贪心确实是一个不错的算法,首先他简单容易想到,我们在操作起来也比较容易。
现在我推荐几道我们oj上的贪心算法的题:soj1562药品运输soj1585 Climbing mountain。
为了引入动归算法我先拿药品运输这道题简单说一下贪心算法。
示例1:药品运输(题目采用小四号Times New Roman字体)Description5.12大地震后,某灾区急需一批药品,现在有N种药品需要运往灾区,而我们的运输能力有限,现在仅有M辆运输车用来运输这批药品,已知不同的药品对灾区具有不同的作用(“作用”用一个整数表示其大小),不同的药品需要的运输力(必要的车辆运载力)不同,而不同的车辆也具有不同的运输力。
同时,我们希望不同的药品用不同的车辆来运输(避免发生混淆)。
现在请你帮忙设计一方案,来使得运往灾区的药品对灾区的作用最大。
Input第一行包含一个整数T,表示需要处理的测试数据组数。
每一组第一行包括两个整数N,M,分别表示药品总数,及车辆总数。
接着第二行包含N个整数(pi<=10000),分别表示每种药品的作用。
接着第三行包含N个整数,分别表示每种药品必须得运载力(wi<=1000)。
接着第四行包含M个整数,表示每辆车的运输力(c<=1000);(T<=10; N,M<=1000)Output输出包括T行,每行仅一个整数,表示最大的作用值。
专辑:[经典传奇] 大全集【视频集系列】7
![专辑:[经典传奇] 大全集【视频集系列】7](https://img.taocdn.com/s3/m/45e9a0374b73f242336c5fb6.png)
专辑:[经典传奇] 大全集【视频集系列】7
珍宝奇案甲骨风云珍宝奇案夺宝奇兵门神的离奇回家路三百年女尸惊悚复活迷雾重重的野人山汉后宫密道的惊天秘密N种武器笑傲江湖笑傲江湖龙虎斗京华少林寺传奇江南奇侠传大侠是这样练成的外星人到此一游美军基地诡秘奇闻录克格勃的蓝色档案深渊幽灵与火星人的第三类接触陈洁如的悲情人生乱世胡蝶舞迷离霍元甲死亡背后的真凶流氓大亨(上)流氓大亨(下)潜伏蒋介石身边的女人潜伏胡宗南身边的日子戴手铐的大特务潜谍名单背后的秘密“永不消失”电波背后真实的谎言达芬奇密码背后的真相吸血鬼现形记请小心外星人出没音乐杀人事件死人复活之谜龙骨疑云四个太阳和末日景象千年女尸惊悚黑骨之谜罪恶的DNA魔术吸血男孩背后的真相八肢宝宝惊心动魄重生阴阳姐妹的艰难还原记“怪病树”的惊人秘密。
底层逻辑 的思考

e7d195523061f1c01bc539b90b65f09aca9bc726a3a4adba8C9E45B38E36AC8707C5D393223713CC8DD27123EF48A81803B5A1BFF3646AC546C23D4B23F46D5703AE6DAEEEE7BB41433C5E719609FF6B94998208177C9D28425E2E91A30F90191353949CE6B3FA6EA29708A031A456522F313FDA337DC4A13BC99DBA34C2FB62D41B53E00C576F18FFEBF2F35E0A383B
1.1 我什么要选择这本书?
这本书里的内容干货,很适合做成PPT可视化呈现,帮助大家更好的阅读和理解,所以做了这份PPT
e7d195523061f1c01bc539b90b65f09aca9bc726a3a4adba8C9E45B38E36AC8707C5D393223713CC8DD27123EF48A81803B5A1BFF3646AC546C23D4B23F46D5703AE6DAEEEE7BB41433C5E719609FF6B94998208177C9D28425E2E91A30F90191353949CE6B3FA6EA29708A031A456522F313FDA337DC4A13BC99DBA34C2FB62D41B53E00C576F18FFEBF2F35E0A383B
?
3.2 如何防止“注射式洗脑”
@木:狡猾的人善于诡辩和魅惑,愚蠢的人多是自大和无知,独立思考和自省是一种稀缺的能力
狡猾的人
愚蠢的人
e7d195523061f1c01bc539b90b65f09aca9bc726a3a4adba8C9E45B38E36AC8707C5D393223713CC8DD27123EF48A81803B5A1BFF3646AC546C23D4B23F46D5703AE6DAEEEE7BB41433C5E719609FF6B94998208177C9D28425E2E91A30F90191353949CE6B3FA6EA29708A031A456522F313FDA337DC4A13BC99DBA34C2FB62D41B53E00C576F18FFEBF2F35E0A383B
没完没了

状态时间 2012-04-13 00:00:00.0 2012-04-13 00:00:00.0 2012-05-11 00:00:00.0 2012-03-23 00:00:00.0 2012-05-07 00:00:00.0 2012-04-16 00:00:00.0 2012-04-16 00:00:00.0 2012-05-07 00:00:00.0 2012-05-07 00:00:00.0 2012-03-28 00:00:00.0 2012-06-01 2012-04-25 00:00:00.0 2012-05-11 00:00:00.0 2012-04-13 00:00:00.0 2012-05-03 00:00:00.0 2012-05-25 00:00:00.0 2012-04-13 00:00:00.0 2012-03-28 00:00:00.0 2012-03-28 00:00:00.0 2012-03-28 00:00:00.0 2012-03-28 00:00:00.0 2012-04-11 00:00:00.0 2012-03-28 00:00:00.0 2012-05-25 00:00:00.0 2012-04-16 00:00:00.0 2012-04-16 00:00:00.0 2012-05-07 00:00:00.0 2012-05-07 00:00:00.0 2012-05-07 00:00:00.0 2012-05-07 00:00:00.0 2012-04-09 00:00:00.0 2012-05-07 00:00:00.0 2012-04-28 00:00:00.0 2012-04-28 00:00:00.0 2012-04-28 00:00:00.0 2012-04-28 00:00:00.0 2012-05-31 00:00:00.0 2012-04-13 00:00:00.0 2012-06-01 00:00:00.0 2012-03-28 00:00:00.0 2012-05-11 00:00:00.0 2012-03-22 00:00:00.0 2012-03-28 00:00:00.0 2012-03-28 00:00:00.0 2012-04-13 00:00:00.0 2012-05-11 00:00:00.0 2012-05-15 00:00:00.0 2012-03-22 00:00:00.0 2012-04-17 00:00:00.0 2012-03-28 00:00:00.0 2012-03-28 00:00:00.0 2012-05-15 00:00:00.0 2012-05-15 00:00:00.0 2012-05-03 00:00:00.0
动规-背包九讲完整版

为什么呢?可以这样理解:初始化的 f 数组事实上就是在没有任何物品可以放入背包时的合 法状态。如果要求背包恰好装满,那么此时只有容量为 0 的背包可能被价值为 0 的 nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都 应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不 装”,这个解的价值为 0,所以初始时状态的值也就全部为 0 了。
前言
本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是 写作一份较为完善的 NOIP 难度的动态规划总结,名为《解动态规划题的基本思考方式》。现 在你看到的是这个写作计划最先发布的一部分。
背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动 态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作 计划的第一部分。
这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始 化进行讲解。
小结
01 背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另 外,别的类型的背包问题往往也可以转换成 01 背包问题求解。故一定要仔细体会上面基本思 路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。
感谢 XiaQ,它针对本文的第一个 beta 版发表了用词严厉的六条建议,虽然我只认同并采纳 了其中的两条。在所有读者几乎一边倒的赞扬将我包围的当时,你的贴子是我的一剂清醒 剂,让我能清醒起来并用更严厉的眼光审视自己的作品。
当然,还有用各种方式对我表示鼓励和支持的几乎无法计数的同学。不管是当面赞扬,或是 在论坛上回复我的贴子,不管是发来热情洋溢的邮件,或是在即时聊天的窗口里竖起大拇 指,你们的鼓励和支持是支撑我的写作计划的强大动力,也鞭策着我不断提高自身水平,谢 谢你们!
背包九讲

By @wgx998877
九 讲
Copy right@中国地质大学(北京)ACM/ICPC 集训队
背包问题及其变化
完全背包
01背包 ZeroOnePack
CompletePack
混合背包 MixedPack
MultiplePack
多重背包
二维费用背包 泛化物品 有依赖背包 分组背包
有N件物品和一个容量为V的背包。第i件物 品的费用是c[i],价值是w[i]。求解将哪些物 品装入背包可使价值总和最大。
void OneZeroPack(int cost,int value){ int i,j; for(i = total;i >= cost; i--) f[i] = max(f[i],f[i-cost]+value); }
逆序! 这就是关键! 1 for i=1..N 2 for v=V..0 3 f[v]=max {f[v],f[v-c[i]]+w[i]}; 4 分析上面的代码:当内循环是逆序时 就可以保证后一个f[v]和f[v-c[i]]+w[i]是前一状态的! 这里给大家一组测试数据: 测试数据: 10,3 3,4 4,5 5,6
二维费用背包
有依赖背包
分组背包
for i=1..N if //第i件物品属于01背包 ZeroOnePack(c[i],w[i]) else if //第i件物品属于完全背包 CompletePack(c[i],w[i]) else if //第i件物品属于多重背包 MultiplePack(c[i],w[i],n[i])
混合背包 MixedPack
MultiplePack
多重背包
for (i = 1; i < N; ++i) { if (cost[i] * amount[i] >= V) { CompletePack(cost[i], weight[i]); return; } int k = 1; while (k < amount[i]) { ZeroOnePack(k*cost[i], k*weight[i]); amount[i] = amount[i] - k; k = k*2; } ZeroOnePack(amount[i]*cost[i], amount[i]*weight[i]); }
产品需求文档模板【范本模板】
<产品名称〉产品需求说明书[注:产品需求说明书的定义:此文档的目的是收集、分析和定义〈〈xxx产品名〉〉的需要和特性。
它包括相关方和目标用户需要的功能和这些需要存在的原因,以及详细地说明所确定的产品的关键外部业务流程、接口和非功能性特性的需求、设计约束。
此文档用来让读者了解产品的外部黑盒概念,并指导《架构设计说明书》和《软件需求说明书》。
一个产品(对外对内具有统一定义的)只有一份《产品需求说明书》,对于分解的对内项目部分可以以《xxxx产品需求说明书—yyyy分册》来撰写。
以下提供的模板用于需求管理流程。
其中包括用方括号括起来并以蓝色斜体(样式=InfoBlue)显示的文本,它们用于向作者提供指导,在发布此文档之前应该将其删除.按此样式输入的段落将被自动设置为普通样式(样式=正文)。
]上海市XX网络技术有限公司版权所有内部资料注意保密修订记录:目录一、简介 (12)1、目的 (12)2、范围 (12)二、用户角色描述 (12)三、产品概述 (12)1、总体流程 (13)2、功能摘要 (15)四、产品特性 (16)1、读书人社区首页 (16)1。
1 优先级 (16)1.2 特性描述 (16)1.3 社区首页 (16)1.3.1 读书会列表 (16)1.3。
2 热评书潮 (17)1.3.3 视频节目 (17)1。
3.4 社区名人 (18)1。
3.5 读书会推荐 (18)1.3.6 热门原创 (19)1。
3.7 读书快报(新闻) (20)1.3。
8 合作伙伴列表(页底) (20)2、板块一——藏书阁 (21)2。
1 藏书阁首页 (21)2。
1。
1 页面描述 (21)2.1。
2 搜索 (21)2。
1.3 书籍推荐 (21)2。
1.4 书评推荐 (22)2.1.5 名家读书会专题 (23)2。
1。
6 分类推荐 (24)2。
1.7 一周好书 (25)2。
1。
8 排行榜 (25)2。
1.9 读书会推荐 (27)2。
《你的背包》歌词
你的背包
作词:林夕作曲:蔡政
演唱:陈奕迅
一九九五年我们在机场的车站你借我而我不想归还
那个背包载满纪念品和患难还有摩擦留下的图案
你的背包背到现在还没烂却成为我身体另一半
千金不换它已熟悉我的汗它是我肩膀上的指环
背了六年半我每一天陪它上班你借我我就为你保管
我的朋友都说它旧得很好看遗憾是它已与你无关
你的背包让我走得好缓慢总有一天陪着我腐烂
你的背包对我沉重的审判
借了东西为什么不还
你的背包让我走得好缓慢总有一天陪着我腐烂你的背包对我沉重的审判借了东西为什么不还
借了东西为什么不还。
背包九讲(DD)
背包问题九讲目录第一讲 01背包问题第二讲完全背包问题第三讲多重背包问题第四讲混合三种背包问题第五讲二维费用的背包问题第六讲分组的背包问题第七讲有依赖的背包问题第八讲泛化物品第九讲背包问题问法的变化附:USACO中的背包问题前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为《解动态规划题的基本思考方式》。
现在你看到的是这个写作计划最先发布的一部分。
背包问题是一个经典的动态规划模型。
它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作计划的第一部分。
读本文最重要的是思考。
因为我的语言和写作方式向来不以易于理解为长,思路也偶有跳跃的地方,后面更有需要大量思考才能理解的比较抽象的内容。
更重要的是:不大量思考,绝对不可能学好动态规划这一信息学奥赛中最精致的部分。
你现在看到的是本文的1.0正式版。
我会长期维护这份文本,把大家的意见和建议融入其中,也会不断加入我在OI学习以及将来可能的ACM-ICPC的征程中得到的新的心得。
但目前本文还没有一个固定的发布页面,想了解本文是否有更新版本发布,可以在OIBH论坛中以“背包问题九讲”为关键字搜索贴子,每次比较重大的版本更新都会在这里发贴公布。
目录第一讲 01背包问题这是最基本的背包问题,每个物品最多只能放一次。
第二讲完全背包问题第二个基本的背包问题模型,每种物品可以放无限多次。
第三讲多重背包问题每种物品有一个固定的次数上限。
第四讲混合三种背包问题将前面三种简单的问题叠加成较复杂的问题。
第五讲二维费用的背包问题一个简单的常见扩展。
第六讲分组的背包问题一种题目类型,也是一个有用的模型。
后两节的基础。
第七讲有依赖的背包问题另一种给物品的选取加上限制的方法。
第八讲泛化物品我自己关于背包问题的思考成果,有一点抽象。
正版原创1100数字密码表
601 林黛玉 611 懒洋洋 621 林志颖 631 雷思雨 641 雷向阳 651 龙王爷 661 李莲英 671 刘青云 681 淋巴液 691 辣椒油
602 拉肚子 612 老爷子 622 狼崽子 632 老鼠仔 642 螺旋藻 652 绿袜子 662 李丽珍 672 李清照 682 铝箔纸 692 绿军装
705 强盗窝 715 汽油味 725 千字文 735 青蛇王 745 强行吻 755 齐威王 765 全能王 775 恰恰舞 785 骑白虎 795 拳击王
706 请登录 716 七叶莲 726 黔之驴 736 青石路 746 七仙女 756 情未了 766 弃疗啦 776 清乾隆 786 起波澜 796 起巨浪
609 鹿鼎记 619 林尤坚 629 辣子鸡 639 蓝水晶 649 历险记 659 联网机 669 流浪记 679 篮球架 689 老北京 699 辣椒酱
610 冷饮店 620 隆中对 630 螺丝刀 640 刘玄德 650 芦苇荡 660 啦啦队 670 篮球队 680 冷板凳 690 垃圾袋 700 钱多多
703 穷屌丝 713 清一色 723 嵌钻石 733 清爽水 743 钱学森 753 驱蚊树 763 情侣衫 773 牵牵手 783 乔布斯 793 清洁刷
704 脐带血 714 汽油箱 724 全智贤 734 全身像 744 去洗洗 754 权威性 764 七里香 774 鹊桥仙 784 铅笔芯 794 墙角线
正版原创1000数字密码表
中文是对应的数字拼音第一个字母:0-D,1-Y,2-Z,3-S,4-X,5-W,6-L,7-Q,8-B,9-J,例如001,就是DDZ,是斗地主的拼音首字母。
001 钓大鱼 011 电影院 021 电子烟 031 大深渊 041 大西洋 051 动物园 061 德鲁伊 071 地球仪 081 大暴雨 091 斗鸡眼 002 斗地主 012 打野战 022 大蜘蛛 032 打水仗 042 低胸装 052 打蚊子 062 顶梁柱 072 大钳子 082 地板砖 092 大镜子 003 打地鼠 013 打印室 023 电子书 033 动手术 043 斗蟋蟀 053 大王山 063 杜蕾斯 073 呆寝室 083 电贝司 093 独角兽 004 读大学 014 大阳线 024 大闸蟹 034 豆沙馅 044 大猩猩 054 达文西 064 电缆线 074 点秋香 084 电冰箱 094 打鸡血 005 敌敌畏 015 第一湾 025 大张伟 035 大蛇丸 045 大漩涡 055 大胃王 065 大力丸 075 赌钱王 085 点播网 095 堆积物 006 打电脑 016 独眼龙 026 大长老 036 大色狼 046 大学路 056 队伍里 066 大奶牛 076 吊起来 086 大菠萝 096 毒胶囊 007 打打球 017 电影券 027 邓紫棋 037 斗兽棋 047 蹲下去 057 打网球 067 打篮球 077 荡秋千 087 打棒球 097 倒酒器 008 大东北 018 大阅兵 028 掉渣饼 038 豆沙包 048 掉馅饼 058 大王八 068 大萝卜 078 肚脐部 088 大波波 098 单肩包 009 打豆浆 019 打印机 029 打桩机 039 电视机 049 董小姐 059 打围巾 069 邓丽君 079 打群架 089 大保健 099 大将军 010 电熨斗 020 肚子大 030 大山洞 040 电须刀 050 低洼地 060 大脑袋 070 毒气弹 080 盗版碟 090 大酒店 100 一百元 501 维多利 511 外用药 521 吴镇宇 531 五十元 541 王欣雨 551 娃娃鱼 561 五粮液 571 温泉浴 581 尾巴痒 591 无机盐 502 胃胆汁 512 地震 522 蚊帐子 532 卫生纸 542 微笑着 552 娃娃装 562 亡灵族 572 围棋子 582 歪脖子 592 挖金子 503 武当山 513 吴宇森 523 梧州市 533 维生素 543 五行山 553 万万岁 563 乌龙寺 573 忘情水 583 五步蛇 593 吴家山 504 武打戏 514 玩游戏 524 王祖贤 534 卫生香 544 外向型 554 慰问信 564 温丽霞 574 文曲星 584 五边形 594 玩具熊 505 505 515 巫妖王 525 五指袜 535 微生物 545 我洗碗 555 电池 565 王老五 575 网球网 585 捂被窝 595 王家卫 506 武大郎 516 维也纳 526 王祖蓝 536 卫斯理 546 王心凌 556 娃娃脸 566 乌溜溜 576 吴奇隆 586 微波炉 596 王健林 507 晚点去 517 五元钱 527 五子棋 537 卫生球 547 外星球 557 娃娃亲 567 王励勤 577 网前球 587 王宝强 597 五角钱 508 舞蹈班 518 文艺报 528 武装部 538 污水泵 548 韦小宝 558 吻我吧 568 伍老板 578 武器包 588 窝粑粑 598 王家坝 509 温度计 519 望远镜 529 王昭君 539 卫生巾 549 王小军 559 喔喔叫 569 王老吉 579 挖墙脚 589 五笔键 599 文件夹 510 午夜档 520 520 530 瓦斯弹 540 维修店 550 魏武帝 560 王珞丹 570 武器店 580 王八蛋 590 无间道 600 拉丁灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
背包问题九讲 v1.0目录第一讲 01背包问题第二讲完全背包问题第三讲多重背包问题第四讲混合三种背包问题第五讲二维费用的背包问题第六讲分组的背包问题第七讲有依赖的背包问题第八讲泛化物品第九讲背包问题问法的变化附:USACO中的背包问题前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为《解动态规划题的基本思考方式》。
现在你看到的是这个写作计划最先发布的一部分。
背包问题是一个经典的动态规划模型。
它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作计划的第一部分。
读本文最重要的是思考。
因为我的语言和写作方式向来不以易于理解为长,思路也偶有跳跃的地方,后面更有需要大量思考才能理解的比较抽象的内容。
更重要的是:不大量思考,绝对不可能学好动态规划这一信息学奥赛中最精致的部分。
你现在看到的是本文的1.0正式版。
我会长期维护这份文本,把大家的意见和建议融入其中,也会不断加入我在OI学习以及将来可能的ACM-ICPC的征程中得到的新的心得。
但目前本文还没有一个固定的发布页面,想了解本文是否有更新版本发布,可以在OIBH论坛中以“背包问题九讲”为关键字搜索贴子,每次比较重大的版本更新都会在这里发贴公布。
目录第一讲 01背包问题这是最基本的背包问题,每个物品最多只能放一次。
第二讲完全背包问题第二个基本的背包问题模型,每种物品可以放无限多次。
第三讲多重背包问题每种物品有一个固定的次数上限。
第四讲混合三种背包问题将前面三种简单的问题叠加成较复杂的问题。
第五讲二维费用的背包问题一个简单的常见扩展。
第六讲分组的背包问题一种题目类型,也是一个有用的模型。
后两节的基础。
第七讲有依赖的背包问题另一种给物品的选取加上限制的方法。
第八讲泛化物品我自己关于背包问题的思考成果,有一点抽象。
第九讲背包问题问法的变化试图触类旁通、举一反三。
附:USACO中的背包问题给出 USACO Training 上可供练习的背包问题列表,及简单的解答。
联系方式如果有任何意见和建议,特别是文章的错误和不足,或者希望为文章添加新的材料,可以通过/user/tianyi/这个网页联系我。
致谢感谢以下名单:•阿坦•jason911•donglixp他们每人都最先指出了本文第一个beta版中的某个并非无关紧要的错误。
谢谢你们如此仔细地阅读拙作并弥补我的疏漏。
感谢 XiaQ,它针对本文的第一个beta版发表了用词严厉的六条建议,虽然我只认同并采纳了其中的两条。
在所有读者几乎一边倒的赞扬将我包围的当时,你的贴子是我的一剂清醒剂,让我能清醒起来并用更严厉的眼光审视自己的作品。
当然,还有用各种方式对我表示鼓励和支持的几乎无法计数的同学。
不管是当面赞扬,或是在论坛上回复我的贴子,不管是发来热情洋溢的邮件,或是在即时聊天的窗口里竖起大拇指,你们的鼓励和支持是支撑我的写作计划的强大动力,也鞭策着我不断提高自身水平,谢谢你们!最后,感谢Emacs这一世界最强大的编辑器的所有贡献者,感谢它的插件EmacsMuse的开发者们,本文的所有编辑工作都借助这两个卓越的自由软件完成。
谢谢你们——自由软件社群——为社会提供了如此有生产力的工具。
我深深钦佩你们身上体现出的自由软件的精神,没有你们的感召,我不能完成本文。
在你们的影响下,采用自由文档的方式发布本文档,也是我对自由社会事业的微薄努力。
P01: 01背包问题题目有N件物品和一个容量为V的背包。
第i件物品的重量是c[i],价值是w[i]。
求解将哪些物品装入背包可使价值总和最大。
基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。
则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。
所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。
如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
优化空间复杂度以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。
先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[i][0..V]的所有值。
那么,如果只用一个数组f[0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]两个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v-c[i]]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值。
伪代码如下:for i=1..Nfor v=V..0f[v]=max{f[v],f[v-c[i]]+w[i]};其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因为现在的f[v-c[i]]就相当于原来的f[i-1][v-c[i]]。
如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了f[i][v]由f[i][v-c[i]]推知,与本题意不符,但它却是另一个重要的背包问题P02最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。
事实上,使用一维数组解01背包的程序在后面会被多次用到,所以这里抽象出一个处理一件01背包中的物品过程,以后的代码中直接调用不加说明。
过程ZeroOnePack,表示处理一件01背包中的物品,两个参数cost、weight分别表明这件物品的费用和价值。
procedure ZeroOnePack(cost,weight)for v=V..costf[v]=max{f[v],f[v-cost]+weight}注意这个过程里的处理与前面给出的伪代码有所不同。
前面的示例程序写成v=V..0是为了在程序中体现每个状态都按照方程求解了,避免不必要的思维复杂度。
而这里既然已经抽象成看作黑箱的过程了,就可以加入优化。
费用为cost 的物品不会影响状态f[0..cost-1],这是显然的。
有了这个过程以后,01背包问题的伪代码就可以这样写:for i=1..NZeroOnePack(c[i],w[i]);初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。
有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。
一种区别这两种问法的实现方法是在初始化的时候有所不同。
如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。
如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。
为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。
如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。
如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。
这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。
小结01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。
故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。
首页P02: 完全背包问题题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。
第i种物品的费用是c[i],价值是w[i]。
求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
基本思路这个问题非常类似于01背包问题,所不同的是每种物品有无限件。
也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。
如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。
仍然可以按照每种物品不同的策略写出状态转移方程,像这样:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}这跟01背包问题一样有O(N*V)个状态需要求解,但求解每个状态的时间已经不是常数了,求解状态f[i][v]的时间是O(v/c[i]),总的复杂度是超过O(VN)的。
将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。
这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。
但我们还是试图改进这个复杂度。
一个简单有效的优化完全背包问题有一个很简单有效的优化,是这样的:若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。
这个优化的正确性显然:任何情况下都可将价值小费用高得j换成物美价廉的i,得到至少不会更差的方案。
对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。
然而这个并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。
这个优化可以简单的O(N^2)地实现,一般都可以承受。
另外,针对背包问题而言,比较不错的一种方法是:首先将费用大于V的物品去掉,然后使用类似计数排序的做法,计算出费用相同的物品中价值最高的是哪个,可以O(V+N)地完成这个优化。
这个不太重要的过程就不给出伪代码了,希望你能独立思考写出伪代码或程序。
转化为01背包问题求解既然01背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题转化为01背包问题来解。