动态规划之背包问题

原创 2018年04月15日 14:01:23

动态规划之背包问题

1.01背包问题
  • 题目描述:

有N件物品和一个容量为V的背包。放入第i 件物品耗费的空间是Ci ,得到的价值是Wi,求解将哪些物品装入背包可使价值总和最大。

  • 状态转移方程:

F[i][v] = max(F[i1][v],F[i1][vCi]+Wi)

i1,重量为v的状态下,放或者不放第i件物品。

  • 将二维转化至一维可得伪代码:复杂度:O(VN)
void ZeroOnePack(F,C,W)
{
    for v = V to C //从V到C是进行了优化
       F[v]=max{F[v],F[v-C]+W};
}
for i = 1 to N 
    ZeroOnePack(F,C[i],W[i]);
  • 初始化的细节问题:

如果要求恰好装满背包,则初始化时,F[0]=0 ,其余F[1V]=

若未要求恰好装满,则F[0V]=0

  • 个人对于代码的理解:

i 从1到n刷新数组,所以每一个i在使用数组时,都有i1使用过的痕迹,所以起到了状态的限制。

另外,v从V到0,当计算较大的v时,较小的v还没有放入i,所以保证了所有的物品只被放入一次。

2.完全背包问题
  • 题目描述:

有N种物品和一个容量为V的背包,每种物品都有无限件可以用,放入第i件物品耗费的空间是Ci,得到的价值是Wi。求解:将哪些物品放入背包,可使这些物品耗费的空间总和不超过背包的容量,且价值总和最大。

  • 状态转移方程:

F[i][v] = max(F[i1][v],F[i1][vkCi]+kWi)

F[i][v] = max(F[i1][v],F[i][vCi]+Wi)

  • 可能的优化方法:

去掉重量大于V的,对于cost相同的物品,只选择weight最大的

  • 伪代码:O(VN)
void CompletePack(F,C,W)
{
    for v = C to V 
       F[v]=max{F[v],F[v-C]+W};
}
for i = 1 to N 
    CompletePack(F,C[i],W[i]);
  • 个人对于代码的理解:

使v从C到V,当v较大时,较小的v已经被更新过,所以相当于可以重复往背包里放入同一个物体。

3.多重背包问题
  • 题目描述:

有N件物品和一个容量为V的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci,价值是Wi。求解将哪些物品装入背包可使这些物品耗费的空间总和不超过背包容量,且价值总和最大。

  • 状态转移方程:

F[i][v] = max(F[i1][v],F[i1][vkCi]+kWi)0kMi

  • 伪代码:O(VlogMi)
void MultiplePack(F,C,W,M)
{
  if(C*M>=V){
    CompletePack(F,C,W);
    return ;
  }
  k=1;
  while(k<M){
    ZeroOnePack(F,k*C,k*W);
    M=M-k;
    k=k*2;
    ZeroOnePack(F,M*C,M*W);
  }
}
  • 代码理解:

将多重背包转化为完全背包和01背包。如果物品对于背包不能视作完全,就将物品拆成1,2,4,8……的01背包。

【动态规划】三种基本背包问题

动态规划 是对解最优化问题的一种途径 它往往是针对一种最优化问题 根据问题的不同性质 确定不同的设计方法 因为这篇文章我想说点关于背包问题的事情 所以不再过多介绍动态规划 背包问题 是动态规划...
  • qq_36303472
  • qq_36303472
  • 2017-03-31 21:35:54
  • 4607

0-1背包问题 动态规划源码

  • 2008年08月20日 23:06
  • 250KB
  • 下载

动态规划和贪心算法之背包问题理解

一.背包问题引用书上关于0-1背包和部分背包的阐述: 二.贪心与动态规划区别关于红色矩形部分解释为什么0-1不能使用贪心算法,是因为当你选择一个物品时,整个物品的大小都需要计算,然而背包的的大小...
  • qq_16234613
  • qq_16234613
  • 2016-08-17 21:55:05
  • 6837

动态规划小结——背包问题

背包问题是动态规划的经典问题,因此,有必要弄清跟背包问题的所有分析过程并熟练掌握各种类型的代码 一,完全背包问题 1.问题描述:有n种物品,每种物品有无限多个,第i个物品重量是wi,价值是vi,从这些...
  • u014800748
  • u014800748
  • 2015-02-12 12:24:58
  • 722

Python中运用动态规划解决背包问题

首先,先请大家了解一下动态规划以及背包问题是啥,已经了解的请略过 动态规划 动态规划与分治法相似,都是通过组合子问题的解来求解原问题,它通常用来求解最优化问题,这类问题可以有很多可行解,每...
  • qq_38454977
  • qq_38454977
  • 2017-05-05 22:38:59
  • 380

动态规划初步-完全背包问题

问题描述: 有n种重量和价值分别为wi,vi的物品。从这些物品中挑选总重量不超过m的物品,求出挑选物品价值总和的最大值。在这里,每种物品可以挑选任意多件。 限制条件: 1 1 ...
  • stack_queue
  • stack_queue
  • 2016-10-25 17:56:06
  • 838

动态规划之背包问题(二):完全背包问题

完全背包问题 问题描述 在上一篇里,有关01背包问题,我们在状态转移函数、是否需要放满、利用一维数组优化空间复杂度几个方面做了阐述。本篇要解决的是完全背包问题,描述如下: 有N种物品和一个容量为...
  • siyu1993
  • siyu1993
  • 2016-10-19 14:09:49
  • 1425

完全背包问题 动态规划

描述:现有n件物品,每件物品有无数个,每件物品有一个价值w和一个体积v,还有一个容量为tv的背包,现在要求使得在背包的容量之内使得价值最大。 分析: 我们从决策入手来解决这个问题,我们每一个决策就...
  • u013555159
  • u013555159
  • 2016-01-18 22:33:23
  • 1375

背包问题与动态规划的基本思想

网上有很多关于背包问题和动态规划的代码实现文章,但是如何理解动态规划的思想才是最关键的,尤其如何理解成这是一个多阶段的决策过程尤为重要,下面的这个动态规划讲解非常好,主要从两个思路来讲解动态规划,一个...
  • mao_kun
  • mao_kun
  • 2013-10-24 20:11:15
  • 11741

背包问题,动态规划求解,matlab代码,c++代码

最近写论文接触到背包问题,查阅网上一些资料,对于简单的0-1背包问题,动态规划算法可以求解,最近花时间整理整理。...
  • robert_chen1988
  • robert_chen1988
  • 2016-09-08 16:42:19
  • 3594
收藏助手
不良信息举报
您举报文章:动态规划之背包问题
举报原因:
原因补充:

(最多只允许输入30个字)