[转]背包问题九讲v1.0( 附:USACO中的背包问题)

USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动。
<p>USACO Trainng是一个很适合初学者的题库,我认为它的特色是题目质量高,循序渐进,还配有不错的课文和题目分析。其中关于背包问题的那篇课文 (TEXT Knapsack Problems) 也值得一看。
<p>另外,USACO Contest是USACO常年组织的面向全球的竞赛系列,在此也推荐NOIP选手参加。
<p>我整理了USACO Training中涉及背包问题的题目,应该可以作为不错的习题。其中标加号的是我比较推荐的,标叹号的是我认为对NOIP选手比较有挑战性的。

题目列表

Inflate (+) (基本01背包)
Stamps (+)(!) (对初学者有一定挑战性)
Money
Nuggets
Subsets
Rockers (+) (另一类有趣的“二维”背包问题)
Milk4 (!) (很怪的背包问题问法,较难用纯DP求解)

题目简解

以下文字来自我所撰的《USACO心得》一文,该文的完整版本,包括我的程序,可在[DD的USACO征程]中找到。
<p>Inflate是加权01 背包问题,也就是说:每种物品只有一件,只可以选择放或者不放;而且每种物品有对应的权值,目标是使总权值最大或最小。它最朴素的状态转移方程是:f[k][i] = max{f[k-1][i],f[k-1][i-v[k]]+w[k]}f[k][i]表示前k件物品花费代价i可以得到的最大权值。v[k]w[k]分别是第k件物品的花费和权值。可以看到,f[k]的求解过程就是使用第k件物品对f[k-1]进行更新的过程。那么事实上就不用使用二维数组,只需要定义f[i],然后对于每件物品k顺序地检查f[i]f[i-v[k]]+w[k]的大小,如果后者更大,就对前者进行更新。这是背包问题中典型的优化方法。
<p>题目stamps中,每种物品的使用量没有直接限制,但使用物品的总量有限制。求第一个不能用这有限个物品组成的背包的大小。(可以这样等价地认为)设f[k][i]表示前k件物品组成大小为i的背包, 最少需要物品的数量。则f[k][i]= min{f[k-1][i],f[k-1][i-j*s[k]]+j},其中j是选择使用第k件物品的数目,这个方程运用时可以用和上面一样的方法处理成一维的。求解时先设置一个粗糙的循环上限,即最大的物品乘最多物品数。
<p>Money是多重背包问题。也就是每个物品可以使用无限多次。要求解的是构成一种背包的不同方案总数。基本上就是把一般的多重背包的方程中的min改成sum就行了。
<p>Nuggets的模型也是多重背包。要求求解所给的物品不能恰好放入的背包大小的最大值(可能不存在)。只需要根据“若i、j 互质,则关于x、y 的不定方程ix+yj=n 必有正整数解,其中n>ij”这一定理得出一个循环的上限。Subsets 子集和问题相当于物品大小是前N个自然数时求大小为N*(N+1)/4的 01 背包的方案数。
<p>
Rockers*可以利用求解背包问题的思想设计解法。我的状态转移方程如下:

f[i][j][t]=max{f[i][j][t-1],f[i-1][j][t],f[i-1][j][t-time[i]]+1,f[i-1][j-1][T]+(t>=time[i])}```
其中```f[i][j][t]```表示前```i```首歌用```j```张完整的盘和一张录了t 分钟的盘可以放入的最多歌数,T 是一张光盘的最大容量,```t>=time[i]```是一个bool 值转换成int 取值为0 或1。但我后来发现我当时设计的状态和方程效率有点低,如果换成这样:```f[i][j]=(a,b)```表示前```i```首歌中选了```j```首需要用到```a```张完整的光盘以及一张录了```b```分钟的光盘,会将时空复杂度都大大降低。这种将状态的值设为二维的方法值得注意。
<p>**Milk4**是这些类背包问题中难度最大的一道了。很多人无法做到将它用纯DP 方法求解,而是用迭代加深搜索枚举使用的桶,将其转换成多重背包问题再DP。由于 USACO 的数据弱,迭代加深的深度很小,这样也可以AC,但我们还是可以用纯DP 方法将它完美解决的。设```f[k]```为称量出```k```单位牛奶需要的最少的桶数。那么可以用类似多重背包的方法对```f```数组反复更新以求得最小值。然而困难在于如何输出字典序最小的方案。我们可以对每个```i```录```pre_f[i]```和```pre_v[i]```。表示得到```i```单位牛奶的过程是用```pre_f[i]```单位牛奶加上若干个编号为```pre_v[i]```的桶的牛奶。这样就可以一步步求得得到```i```单位牛奶的完整方案。为了使方案的字典序最小,我们在每次找到一个耗费桶数相同的方案时对已储存的方案和新方案进行比较再决定是否更新方案。为了使这种比较快捷,在使用各种大小的桶对```f```数组进行更新时先大后小地进行。USACO 的官方题解正是这一思路。如果认为以上文字比较难理解可以阅读官方程序或我的程序。
####转载:dd_engi 的背包九讲
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容