HDU - 2602 Bone Collector(01背包讲解)
题意:01背包:有N件物品和一个容量为V的背包。每种物品均只有一件。第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大。
分析:
1、构造二维数组:
dp[i][j]---前i件物品放入一个容量为j的背包可以获得的最大价值。
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]);---(a)
(1)dp[i - 1][j]---不放第i件物品,因此前i件物品放入一个容量为j的背包的价值与前i-1件物品放入一个容量为j的背包的价值相同。
(2)dp[i - 1][j - volume[i]] + value[i]---放入第i件物品,因为当前背包容量为j,所以需要将前i-1件物品放入容量为j-volume[i]的背包里,剩下的容量为volume[i]的空间放第i件物品。
2、构造滚动数组:(一维)
dp[j]---当前状态是容量为j的背包所得价值。
dp[j] = max(dp[j], dp[j - volume[i]] + value[i]);---(b)
比较上述a式,
b式中的第一个dp[j]是考虑第i件物品的,即当前状态。
而 dp[j - volume[i]] + value[i]和第二个dp[j]是考虑第i-1件物品的,即前一个状态。
因此通过逆序枚举(V……volume[i])的方式更新dp[j]。
原因:因为如果正序,对于正在考虑的物品i,前面已更新的dp[j]会对后面更大容量的dp[j]的更新产生影响,
即此时你计算的dp[i][j](用二维数组表示)其实是max(dp[i - 1][j], dp[i][j-volume[i])。
而逆序枚举,对于当前研究的物品i状态下的dp[j](即将计算),dp[j]和更小容量的dp[j - volume[i]]都是未更新的,也就是我们需要的前一状态,即第i-1件物品的情况。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 1000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int value[MAXN], volume[MAXN], dp[MAXN];
int main(){
int T;
scanf("%d", &T);
while(T--){
int N, V;
scanf("%d%d", &N, &V);
for(int i = 0; i < N; ++i){
scanf("%d", &value[i]);
}
for(int i = 0; i < N; ++i){
scanf("%d", &volume[i]);
}
memset(dp, 0, sizeof dp);
for(int i = 0; i < N; ++i){
for(int j = V; j >= volume[i]; --j){
dp[j] = max(dp[j], dp[j - volume[i]] + value[i]);
}
}
printf("%d\n", dp[V]);
}
return 0;
}
HDU - 2602 Bone Collector(01背包讲解)的更多相关文章
- HDU 2602 Bone Collector(01背包裸题)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 2602 - Bone Collector - [01背包模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Many years ago , in Teddy’s hometown there was a ...
- HDU 2602 Bone Collector --01背包
这种01背包的裸题,本来是不想写解题报告的.但是鉴于还没写过背包的解题报告.于是来一发. 这个真的是裸的01背包. 代码: #include <iostream> #include < ...
- HDU 2602 Bone Collector (01背包DP)
题意:给定一个体积,和一些物品的价值和体积,问你最大的价值. 析:最基础的01背包,dp[i] 表示体积 i 时最大价值. 代码如下: #pragma comment(linker, "/S ...
- [HDU 2602]Bone Collector ( 0-1背包水题 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 水题啊水题 还给我WA了好多次 因为我在j<w[i]的时候状态没有下传.. #includ ...
- HDU 2602 Bone Collector (01背包问题)
原题代号:HDU 2602 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 原题描述: Problem Description Many yea ...
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...
- HDU 2602 Bone Collector 0/1背包
题目链接:pid=2602">HDU 2602 Bone Collector Bone Collector Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 2602 Bone Collector(01背包)模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...
- HDU 2602 Bone Collector(经典01背包问题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/O ...
随机推荐
- 解决css中display:inline-block产生的空隙问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- class中static总结-静态成员函数和静态成员变量
C++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类声明以外初始化,我们一般选择在类的实现文件中初始化,初始化的方式是书写一遍类型的定义: //A.cpp ); //使用 ...
- 4 (计算机网络) DHCP与PXE:IP是怎么来的,又是怎么没的?
如何配置 IP 地址? 那如何配置呢?如果有相关的知识和积累,你可以用命令行自己配置一个地址.可以使用 ifconfig,也可以使用 ip addr.设置好了以后,用这两个命令,将网卡 up 一下,就 ...
- Day10 - 灾难 HYSBZ - 2815
Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生 ...
- 「AMPPZ2014」The Prices
传送门 Luogu团队题链接 解题思路 看到 \(m\) 这么小,马上想到状压 \(\text{DP}\). 设 \(dp[i][j]\) 表示在前 \(i\) 家商店中已买商品的状态为 \(j\) ...
- 易升地址,windows 10, 1511 升级 1607 仍然有效
https://www.microsoft.com/zh-cn/software-download/windows10 易升地址, windows 10 ,1511 升级 1607 仍然有效
- python2中新式类和经典类的多重继承调用顺序
class A: def foo(self): print('called A.foo()') class B(A): pass class C(A): def foo(self): print('c ...
- 1-8SpringBoot之切面AOP
SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍: AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器: @As ...
- aforge视频录像,对界面进行重绘
由于项目需要,需要录像的时候在界面加多一个圆圈,并且一起录制下来. 只需要在NewFrame增加以下代码 private void videoSourcePlayer1_NewFrame(object ...
- <BitMap>大名鼎鼎的bitmap算法
BitMap 抛砖引玉 首先,我们思考一个问题:如何在3亿个整数(0~2亿)中判断某一个数是否存在?现在只有一台机器,内存只有500M 这个问题像不像我们之前提到过的一个在0-10个数中,判断某一个数 ...