(HDUACM201303版_07)背包专题_7805259课稿.ppt

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ACM程序设计 杭州电子科技大学 刘春英 acm@hdu.edu.cn 课后作业, 你 了吗? 每周一星(6): 第七讲 背包算法 (Knapsack Algorithm) 导引问题-食堂就餐 现有餐券1张,面值10元 菜肴N种(价格精确到0.1元):炸鸡腿3元;大排1.5元;荷包蛋:1元;炒青菜:1.2元;番茄炒蛋:2.5元 ...... 餐券的特点:一次性使用,不找零; 问:若每种菜只挑一个,为了充分发挥餐券的作用,最多可以消费多少元? 什么是背包问题 背包的基本模型: 给你一个容量为V的背包和若干种物品,在一定的限制条件下(每种物品都占用一定容量),问最多能放进多少价值的物品? 关于背包问题 1、最典型、最基本的DP问题; 2、理解并熟练掌握背包问题意义重大; 3、DP问题中“状态”概念的理解; 4、背包的每个容量就是“状态”,选择每个物品就是“状态的决策”; 背包问题的分类 01背包 完全背包 多重背包 混合三种背包 二维费用背包 分组背包 有依赖的背包 一、01背包 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]} 一、01背包-Bone Collector Sample Input 1 5 10 1 2 3 4 5 5 4 3 2 1 Sample Output 14 一、01背包-Bone Collector 一、01背包-Bone Collector 时间复杂度N*V , 空间复杂度N*V 空间复杂度优化:只用一位数组DP[j]来实现; 但此时,遍历背包的顺序必须反一反,想想为什么? 01背包问题伪代码如下: for i = 1 to n //所有物品 for j = V to v[i] dp[j] = max(dp[j] , dp[j-v[i]] + w[i]); 空间优化到一维V 原因:如果顺序遍历,一种物品会被取好多次 二、完全背包Piggy-Bank 完全背包特点:一种物品可以取无数个 可否转化成01背包问题? 朴素的转化方式是? 回忆01背包为何要对容量按照逆序循环? 和01背包类似,不过就是正着写! 这类能不能达到的问题应该怎么实现? 三、多重背包 珍惜现在,感恩生活 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 最朴素的想法? 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^k表示 而且总和等于13,所以不会组成超过13的数 所以可将一种有C个的物品拆分成1,2,4,...,2^(k-1),C-(2^k-1) 然后进行01背包 优化部分的参考代码 int t = 1; while (x=t) { v[cnt] = a*t; c[cnt++] = b*t; x -= t; t = 1; } if (x) { v[cnt] = a*x; c[cnt++] = b*x; } 四、混合三种背包 混合背包特点: 如果将三种背包问题混合起来,也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包),应该怎么求解呢? 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]) 详见:背包问题九讲 五、二维费用背包 二维费用背包问题: 对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量),求怎样选择物品可以得到最大的价值。 设第i件物品所需的两种代价分别为a[i]和 b[i],两种代价可付出的最大值(两种背包容量)分别为V和U,物品的价值为w[i]。 对应算法:费用加了一维,只需状态也加一维即可! 设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值,状态转移方程则为: f[i][v][u]=max{f[i-1][

文档评论(0)

贪玩蓝月 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档