0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一、问题描述

0-1背包问题,部分背包问题。分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法。

二、算法原理

(1)0-1背包的DP算法

  0-1背包问题:有n件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。其中每种物品只有一件,可以选择放或者不放。

  最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西。如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量至多为W-wj的最值钱的一包东西。

  用子问题定义状态:令c[i,w]表示前i件物品恰放入一个容量为w的背包可以获得的最大价值。则其状态转移方程便是:

技术分享 

  在将前i件物品放入容量为w的背包中这个子问题,若只考虑第i件物品的策略,如果选择不放第i件物品,那么问题就转化为“前i-1件物品放入容量为w的背包中”,价值为c[i-1,w];如果选择放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为w-wi的背包中”,此时能获得的最大价值就是c [i-1,w-wi]再加上通过放入第i件物品获得的价值vi的和。按照这种思路进行递归,最后的能获得的最大价值即为c[n, W]。

(2)部分背包的贪心算法

  部分背包问题与0-1背包问题相似,不同点在于部分背包问题可以选择物品的一部分,而不是像0-1背包一样只能做二分选择。

部分背包问题同样具有最优子结构的性质。考虑如果从最优货物中去掉某物品j的重量w,则余下的货物必是可以从n-1件原有物品和物品j的wj-w中可带走的,重量至多为W-w的价值最大的一包东西。

  对于部分背包问题,可以使用贪心策略解决。首先对计算每件物品的单位价值,即vi/wi,然后按照贪心策略,在每次进行选择时优先选择单位价值高的物品。也就是说先选择当前单位价值最高的物品,如果拿完了该物品,并且仍然可以选取一些其他物品时,就再选取当前单位价值次高的物品,一直进行下去,直到不能再取为止。

(3)部分背包的DP算法

  部分背包问题也可以用DP算法解决。由于题设中已说明所有物品重量和价值均为整数,利用这一特点,可以巧妙的将部分背包问题转化为0-1背包问题,然后调用0-1背包问题的DP算法进行求解。

  转化方法是:把第i种物品拆成重量依次为1,2,4...2^(k-1),wi-2^k+1的物品,对应的价值则依次是单位价值乘以拆分重量所得结果。在拆分序列中k是满足wi -2^k+1>0的最大整数。例如,如果wi为14,就将这种物品分成系数分别为1,2,4,7的四件物品。这是二进制的思想,这种划分总可以表示该物品可以选择的所有重量值。通过这样的划分得到一个新的重量序列和价值序列,然后将新的重量序列和价值序列作为输入调用0-1背包算法即可解决部分背包问题。(详细思想可以参考背包九讲中的内容)

三、实验数据

(1)三个算法的实验数据输入均为:

  a)     物品的个数n

  b)     每个物品的价值v1,v2……vn

  c)     每个物品的重量w1,w2……wn

  d)     背包的最大重量W

(2)输出均为:

  当前选择的方案所能获得的最大价值

  在本实验对三个算法测试中,将取背包最大容量W为100,物品的个数n为5,所有物品组成的价值序列{v}为{60,100,120,80,90},重量序列{w}为{10,20,30,40,5}。将这些数据依次输入到各个算法中进行测试。

四、源代码

  代码太多了,附下载链接:http://download.csdn.net/detail/zhh1992/8359275

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。