浅谈分组背包
来源:互联网 发布:淘宝卖家工具 编辑:程序博客网 时间:2024/06/17 03:17
分组背包,由基础背包演化而来的一种情况。
具体问题是这样的。具体问题是这样的。一个容量为V的背包,还有若干组物品,每组包含若干物品,这些物品各不相同,而且体积w和价值p各不相同。组内的物品相冲突。求出能在不超过V的情况下尽可能的使价值最大。
乍一看好像很难的样子,其实仔细想想很简单,这种问题完全可以用01背包解决。 对于分组背包,可以这样想:虽然分成很多组,但只能选一个,或者不选,这和01背包是一样的,也就是说,对于01背包里每一个独一无二的物品,对应的分组背包就是每一组中选择一个物品,这样来看,完全就是01背包问题。
下面是状态方程:
for(int i = 1; i <= z; i++)
for(int j = V; j >= 1; j--)
for(int k = 1; k <= n; k++)
dp[j] = max(dp[j - w[i][k]] + p[i][k], dp[j]);
其中,z是分组数,V是背包体积,n是每组物品数量,w和p分别是第i组第k个物品的体积和价值。
为什么要这样写呢?可以想一下01背包的状态方程,和这个外两层的循环是一样的,不一样的是里面又加了一层,这层循环是遍历每一组的物品用的,对于dp[]中每一个状态都是循环了一遍每一组的物品才换到下一个的,所以对后面的没有影响,也就保证了每组物品最多只有一件。
具体问题是这样的。具体问题是这样的。一个容量为V的背包,还有若干组物品,每组包含若干物品,这些物品各不相同,而且体积w和价值p各不相同。组内的物品相冲突。求出能在不超过V的情况下尽可能的使价值最大。
乍一看好像很难的样子,其实仔细想想很简单,这种问题完全可以用01背包解决。 对于分组背包,可以这样想:虽然分成很多组,但只能选一个,或者不选,这和01背包是一样的,也就是说,对于01背包里每一个独一无二的物品,对应的分组背包就是每一组中选择一个物品,这样来看,完全就是01背包问题。
下面是状态方程:
for(int i = 1; i <= z; i++)
for(int j = V; j >= 1; j--)
for(int k = 1; k <= n; k++)
dp[j] = max(dp[j - w[i][k]] + p[i][k], dp[j]);
其中,z是分组数,V是背包体积,n是每组物品数量,w和p分别是第i组第k个物品的体积和价值。
为什么要这样写呢?可以想一下01背包的状态方程,和这个外两层的循环是一样的,不一样的是里面又加了一层,这层循环是遍历每一组的物品用的,对于dp[]中每一个状态都是循环了一遍每一组的物品才换到下一个的,所以对后面的没有影响,也就保证了每组物品最多只有一件。
0 0
- 浅谈分组背包
- 分组背包
- 分组 背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 分组背包
- 运行wordcount 导入FileUtil.java文件出现错误解决办法
- POJ 2288 Islands and Bridges(状压dp)
- 原型模式
- 树状数组
- 【COGS1672】【SPOJ375】QTREE
- 浅谈分组背包
- Spring MVC 入门示例讲解 - howtodoinjava
- 用python实现一些数组的面试题
- 梦博——启程
- 悠闲的老鼠动画片,小鼠波波 Maisy教孩子学英语
- vmware安装linux无法全屏的解决方法
- hash函数_sumary
- bzoj 1036 树的统计
- 关于Ubuntu12.04安装