ImageVerifierCode 换一换
格式:PPT , 页数:10 ,大小:418.50KB ,
资源ID:7788664      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7788664.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(完全背包问题.ppt)为本站会员(HR专家)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

完全背包问题.ppt

1、完全背包问题 (无限背包),主讲人:山成虎,1 问题,2 基本思路,3 空间优化,4小结,1 问题有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是wi,价值是ci。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。,2 基本思路这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件等很多种。如果仍然按照解01背包时的思路,令fiv表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程:fiv=maxfi-1

2、v-k*wi+k*ci|0=k*wi= v。,将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。,核心代码:for i=1N for v=0Vfor k=1v div wifiv=maxfi-1v,fi-1v-k*wi+k*ci;,你会发现,这个伪代码与01背包问题的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么01背包问题中要按照v=V0的逆序来循环。这是因为要保证第i次循环中的状态fiv是由状态fi-1v-wi递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这

3、件策略时,依据的是一个绝无已经选入第i件物品的子结果fi-1v-wi。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果fiv-wi,所以就可以并且必须采用v= 0V的顺序循环。这就是这个简单的程序为何成立的道理。,这个算法也可以以另外的思路得出。例如,基本思路中的状态转移方程可以等价地变形成这种形式:fiv=maxfi-1v,fiv-wi+ci,将这个方程用一维数组实现,便得到了上面的核心代码。,3 空间优化,01背包中,我们使用一维数组来优化空间,完全背包中同样可以!,这个算法使用一维数组,核心代码如下: for

4、 i=1N for v=0Vfv=maxfv,fv-wi+ci;,【问题描述】设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。 【输入格式】第一行:两个整数,M(背包容量,M=200)和N(物品数量,N=30);第2N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。【输出格式】仅一行,一个数,表示最大总价值。,【样例输入】knapsack.in 10 4 2 1 3 3 4 5 7 9 【样例输出】knapsack.out max=12,

5、【解法一:二维数组】,【算法分析】 设 f(i,x)表示前i件物品,总重量不超过x的最优价值,则 f(i,x)=max(f(i,x-wi)+ci,f(i-1,x) ;f(n,m)即为最优解。,【参考程序】:(顺推法) Program knapsack; Const maxm=200;maxn=30; var i,x,n,m:integer;w,c:array1maxn of integer;f:array0maxn,0maxm of integer; BEGIN fillchar(w,sizeof(w),0); fillchar(c,sizeof(c),0);readln(m,n); /背包容

6、量m和物品数量nfor i:=1 to n do /每个物品的重量和价值read(wi,ci);for i:=1 to n do /f(i,x)表示前i件物品,总重量不超过x的最优价值for x:=1 to m doif xfi,x-wi+ci then fi,x:=fi-1,xelse fi,x:=fi,x-wi+ci;writeln(max=, fn,m); / f(n,m)为最优解 END.,【解法一:一维数组】,【算法分析】本问题的数学模型如下: 设 f(x)表示重量不超过x公斤的最大价值, 则 f(x)=maxf(x-wi)+ci 当x=wi ,1=i=n 。 【样例】中间结果下面例

7、出FX表示重量不超过x公斤的最大价值,X表示重量,【参考程序1】:(顺推法) program knapsack04; const maxm=200;maxn=30; type ar=array0maxn of integer; var m,n,x,i,t:integer;c,w:ar;f:array0maxm of integer; BEGIN readln(m,n); /背包容量m和物品数量nfor i:= 1 to n doreadln(wi,ci); /每个物品的重量和价值f0:=0; for x:=1 to m do /设 f(x)表示重量不超过x公斤的最大价值for i:=1 to

8、n doif x=wi then if fx-wi+cifx then fx:= fx-wi+ci ;writeln(max=,fm); / f(m)为最优解 END.,【参考程序2】:(顺推法) program knapsack04; const maxm=200;maxn=30; type ar=array0maxn of integer; var m,n,x,i,t:integer;c,w:ar;f:array0maxm of integer; BEGIN readln(m,n); /背包容量m和物品数量nfor i:= 1 to n doreadln(wi,ci); /每个物品的重量和

9、价值f0:=0; for i:=1 to n dofor x:=1 to m do /设 f(x)表示重量不超过x公斤的最大价值if x=wi then if fx-wi+cifx then fx:= fx-wi+ci ;writeln(max=,fm); / f(m)为最优解 END.,上面的代码中两层for循环的次序可以颠倒,4小结完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程: fiv=maxfi-1v-k*wi+k*ci|0=k*wi= v; fiv=maxfi-1v,fiv-wi+ci; fv=maxfv,fv-wi+ci; 后面两个方程是一个意思。希望你能够对这三个状态转移方程都仔细地体会,不仅记住,也要弄明白它们是怎么得出来的,最好能够自己想一种得到这些方程的过程。,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报