题目

一个旅行者准备随身携带一个背包,可以放入背包的物品有n种,每种物品的重量和价值分别为wj, vj . 如果背包的最大重量限制是b, 怎样选择放入背包的物品以使得背包的价值最大?

目标函数:

约束条件:

算法设计

设Fk(y) 表示只允许装前k 种物品,背包总重不超过y 时背包的最大价值。Fk(y)有两种情况:不装第k件物品或至少装1件第k种物品。

如果不装第k件物品,那么只能用前k-1件物品装入背包,背包的限制重量仍为y,所以最大价值是Fk-1(y);

如果装1件第k件物品,那么装入的第k件物品价值为vk,重量为wk,剩下的物品仍要在前k件里选择(因为每件物品可以装多件,如果只能装1件就是在前k-1件里选择)。于是问题规约为背包限制重量y-wk的情况下前k件物品取得最大价值,即Fk(y-wk)+vk。递推方程与边界条件:

上式初值比较多,F0(y)是不装物品的最大价值;F1(y)是只能装第一件物品时,最多装|_y/w1_|件;递推式Fk(y-wk),y-wk有可能得到负值,即不能再装物品,所以设置最小数以保证在优化问题中淘汰这种情况。

算法实现

标记函数:实现是需要一个ik(y)记录优化函数Fk(y)用到物品的最大标号。计算Fk(y)时,如果Fk-1(y)>Fk(y-wk)+vk,即没有加入第k件物品,ik(y)即为Fk-1(y)的物品最大标号;反正,加入第k件物品,ik(y)记为k。标记函数递归关系:

代码如下:

void Knapsack(int v[N],int w[N],int F[][B+1],int tagi[][B+1]){

for(int k=0;k<=N;k++){

F[k][0]=0;

tagi[k][0]=0;

}

for(int y=0;y<=B;y++){

F[0][y]=0;

F[1][y]=(int)(y/w[0])*v[0];//只能装第一件物品时

tagi[0][y]=0;

}

for(int k=1;k<=N;k++){

for(int y=1;y<=B;y++){

if(y-w[k-1]<0){

F[k][y]=F[k-1][y];

tagi[k][y]=tagi[k-1][y];

}

else{

//允许装入k件物品,价值的两种情况:

//不装第k件物品或至少装1件第k件物品

F[k][y]=F[k-1][y]>F[k][y-w[k-1]]+v[k-1] ? F[k-1][y]:(F[k][y-w[k-1]]+v[k-1]);

tagi[k][y]=F[k-1][y]>F[k][y-w[k-1]]+v[k-1]?tagi[k-1][y]:k;

}

}

}

}

实例及解的追踪

试验下面的例子:

v1=1,v2=3,v3=5,v4=9,w1=2,w2=3,w3=4,w4=7,b=10

运行结果如下图:

我们需要在标记函数ik(y)中把实际解,及每个物品分别装入多少件追踪出来。

由最后i4(10)开始,i4(10)=4,表示此时第4件物品至少装入1件,占用重量w4=7,于是背包剩余重量为10-7=3;继续查询i4(3),由i4(3)=2,表示剩余物品最大标号为2,第2件物品至少装入1件。剩余重量为0,即不能再装入物品。用公式表示追踪解的过程:

根据实例,可以理出追踪解的思路,代码如下:

void TrackSolution(int v[N],int w[N],int tagi[][B+1]){

//x[i-1]标记第i件物品的件数

int x[N];

for(int i=0;i

x[i]=0;

int y=B,j=tagi[N][B];

while (tagi[j][y]!=0){

j=tagi[j][y];

//标记函数最下角ik(y)标记的物品取一件

x[j-1]=1;

y=y-w[j-1];

while (tagi[j][y]==j){

y=y-w[j];

x[j-1]=x[j-1]+1;

}

}

}

运行结果:

其他题目

背包问题是很经典的动态规划问题,很多问题都是背包的变种,比如下面两个题目:

设P是一台Internet上的Web服务器。T={1,2,...,n}是n个下载请求集合,ai为正整数,表示下载请求i所申请的带宽,已知服务器的最大带宽是正整数K。我们的目标是使带宽得到最大限度的利用,即确定T的一个子集S,使得

,且

达到最小。设计一个算法求服务器下载问题。

设有n项任务,加工时间分别表示为正整数t1,t2,...,tn。现有2台同样的机器,从0时刻可以安排对这些任务的加工,知道T时刻所有任务完成,总加工时间为T。设计算法使得总加工时间T最小的调度方案。

第一个题目其实就是0-1背包问题,即看做价值和重量相等(都为ai)的物品装入背包,每件物品最多选1件,总重不能超过K,总价值最大的问题。设Fk(y)表示只允许前k个下载请求,最大带宽不超过y时利用最大限度的带宽数。递推关系和边界条件如下:

注意0-1背包和背包问题的递推关系主要区别是:当选择第k件物品时,Fk(y)表示为Fk-1(y-wk)+vk,而非Fk(y-wk)+vk,即只能在前k-1件物品里继续选择。另外F1(y)的边界函数也不同。

至于第二个题目,其实就是使得一条加工线上的加工时间不超过T/2时加工时间尽可能大的问题,和第一个问题是一样的。

分享到:

2012-11-16 18:39

浏览 727

评论

变种 背包问题_【算法设计】背包问题相关推荐

  1. java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

    文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...

  2. 01背包问题 —— 【算法设计】动态规划

    动态规划 问题背景 有N个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 注意:01背包问题要求一个物品只有0/1两种状态,即装入背包或不装入背包.不能将 ...

  3. 算法设计与分析_算法设计与分析(第2版)第2章分治策略回顾

    YI时间|外刊|MM-DFW|机器学习系列 点击上方蓝字,关注给你写干货的松子茶 分治策略是通用算法设计技术之一,很多有效的算法是它的特殊实现,顾名思义就是分而治之.一个问题能够用分治法求解的要素是 ...

  4. 程振波 算法设计与分析_算法设计与分析

    本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...

  5. 变种 背包问题_算法题:背包问题

    质量约束 背包问题也是一道经典的动态规划问题,它有许多表述形式,什么劫匪小偷抢超市啦,出去旅行要打包啦,简单来说,背包问题给出了一序对集合 ,其中 是物品总重量, 是物品价值,要求从中选取总重量不超过 ...

  6. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

  7. java编程贪心算法背包问题,贪心算法----部分背包问题(java实现)

    部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选 ...

  8. java 简单背包问题_简单的背包问题--java递归实现

    1.主程序 package recursion; //简单背包问题-递归实现- //将不同重量的数据项放入背包中,以使背包的最后 //-----------达到指定的总重量------------- ...

  9. python 算法设计与分析_算法设计与分析(黄建军)

    spContent=本课基于主讲教师在北京大学讲授数据结构与算法课(Python版)的多年教学实践经验,面向具有Python语言程序设计基础的大学生和社会公众,介绍常见的基本数据结构以及相关经典算法, ...

  10. java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)

    一.问题描述 引出问题之前我们先来复习一下矩阵乘积的标准算法. int ra,ca;//矩阵A的行数和列数 int rb,cb;//矩阵B的行数和列数 voidmatrixMultiply() {fo ...

最新文章

  1. 计算机网页设计布局与排版研究,论计算机网页设计的布局与排版
  2. linux系统管理学习笔记之一-------linux解压缩命令
  3. 渗透知识-HTML基础
  4. mysql-plus 动态修改全局sql, 进行数据隔离, 多租户, 多字段修改
  5. SpringMVC学习笔记四:数据绑定
  6. 放弃 Windows 后 ,开源操作系统能成为主流桌面系统吗?
  7. windows与linux网络设置(host-only)
  8. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28
  9. 【Python】AttributeError: ‘DatetimeProperties’ object has no attribute ‘weekday_name’ 的解决方法
  10. 浏览器打不开python的页面_robotframework,selenium启动不了打不开浏览器的问题访问不了网页...
  11. Flink WatermarkKeyed
  12. python操作数据库慢_MySQL数据库之python 拉取mysql 慢日志
  13. Power Desiner逆向生成pdm
  14. 数据结构与与算法之希尔排序
  15. mfc groupbox 边框颜色_蓝色牛仔裤配什么颜色上衣好看
  16. category与extension
  17. 韩语在线翻译图片识别_最强文字识别APP
  18. Kinect 3D视频捕捉
  19. 本地IDEA连接服务器的Redis报错处理
  20. matlab解符号高次方程,matlab解高次方程的问题

热门文章

  1. 实验3-11 求一元二次方程的根
  2. wordpress友联_WordPress制作独立的友情链接(Links)页面
  3. vue在vscode代码格式化
  4. 【时光纪念】愿有岁月可回头
  5. buctoj-python 2022.5.19
  6. 12.Numpy数值计算
  7. 智能语音技术的深度解析
  8. vs2019下载不了的解决办法
  9. PaddleHub创意之艺术风格迁移
  10. 码垛机器人模型图纸分享(附下载)