一、问题描述

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

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论的更多相关文章

  1. WordCount作业提交到FileInputFormat类中split切分算法和host选择算法过程源码分析

    参考 FileInputFormat类中split切分算法和host选择算法介绍  以及 Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputForm ...

  2. (转)两种高效过滤敏感词算法--DFA算法和AC自动机算法

    原文:https://blog.csdn.net/u013421629/article/details/83178970 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路? 有十 ...

  3. nyoj--311--完全背包(动态规划,完全背包)

    完全背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w. ...

  4. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...

  5. Hadoop Mapreduce 中的FileInputFormat类的文件切分算法和host选择算法

    文件切分算法 文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段. FileInputFormat以文件为单位切分成InputSplit.对于每个文件,由以下三 ...

  6. 聚类算法K-Means算法和Mean Shift算法介绍及实现

    Question:什么是聚类算法 1.聚类算法是一种非监督学习算法 2.聚类是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法 3.理论上,相同的组的数据之间有相同的属性或者是特征,不 ...

  7. java实现最小生成树的prim算法和kruskal算法

    在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...

  8. CJOJ 2040 【一本通】分组背包(动态规划)

    CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...

  9. CJOJ 2307 【一本通】完全背包(动态规划)

    CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...

随机推荐

  1. ISO/IEC 14443协议浅谈

    一. 非接触IC卡简介 非接触IC卡又称射频卡,是射频识别技术和IC卡技术有机结合的产物.它解决了无源(卡中无电源)和免接触这一难题,具有更加方便.快捷的特点,广泛用于电子支付.通道控制.公交收费.停 ...

  2. The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2.(不能包含中文路径,qmake够弱智的)

    打开某个项目的时候,编译出现类似的错误 21:46:44: The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2. ...

  3. config.json ajenti

    {    "users": {        "root": {            "configs": {               ...

  4. Android4.3模拟器界面中右侧菜单按钮无法使用问题解决办法

    开发环境:笔记本电脑Windows2008+MyEclipse 10+Android4.3 问题描述:运行或者调试Android项目时,发现模拟器中右侧Menu按钮无法点击,截图如下: 查看在Andr ...

  5. 用javap命令反编译来分析字符串问题

    编写Test.java.编译完后生成Test.class文件,然后对该文件运行javap -c Test命令,生成字节码指令.阅读并得出结论 一.s1和s2指向常量池的不同常量 ①java代码 pub ...

  6. rman 使用catalog备份的演示

    介绍了如何使用catalog方式做RMAN备份,以及如何取消以catalog方式做备份. 第一步:创建RMAN CATALOG表空间及用户. [oracle@oel-01 ~]$ sqlplus / ...

  7. Linux通过网卡驱动程序和版本号的信息

    检查卡制造商和信号 查看基本信息:lspci 查看详情:lspci -vvv   # 3小作文v 查看卡信息:lspci | grep Ethernet 查看网卡驱动 查看网卡驱动信息:lspci - ...

  8. 网络收发之cycleBuf

    #pragma once #include <iostream> #include <string> class cyclebuffer { protected: volati ...

  9. SQL 插入语句汇总

    INSERT VALUES 插入一行或多行到目标表中 -- single row INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipco ...

  10. objective-C学习笔记(二)类 class 和 结构 struct

    Objective-C的类型 引用类型 类 class 指针 pointer 块 block 值类型 基础数值类型 结构 struct 枚举 enum 类型装饰 协议 protocol 类别 cate ...