hdoj 2620 Bone Collector(0-1背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
思路分析:该问题为经典的0-1背包问题;假设状态dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值,则可以推导出dp递推公式
dp[i][v] = Max{dp[i-1][v], dp[i-1][v – c[i]] + w[i]};c[i]表示第i件物品的容量,w[i]表示第i件物品的价值;该动态规划问题每个阶段的决策为是否要
选择第i件物品放入背包中,如果不选择第i件物品,则dp[i][v] = dp[i-1][v],如果选择第i件物品放入背包,则dp[i][v] = dp[i-1][v-c[i]], v-c[i] >= 0;
同时,可以使用一维数组递推,因为递推i时,只需要使用到第i-1行的数组元素,所以可以从V向下递推到0,递推公式如下: dp[v] = MAX(dp[v], dp[v - c[i]] + w[i]),
(一维dp)代码如下:
import java.util.*;
public class Main {
static final int MAX_N = 1000 + 10;
static int[] value = new int[MAX_N];
static int[] volumn = new int[MAX_N];
static int[] dp = new int[MAX_N];
public static int Max(int a, int b) {
return a > b ? a : b;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int case_times = in.nextInt();
while (case_times-- != 0) {
int N, V;
for (int i = 0; i < MAX_N; ++ i)
dp[i] = 0;
N = in.nextInt();
V = in.nextInt();
for (int i = 1; i <= N; ++ i)
value[i] = in.nextInt();
for (int i = 1; i <= N; ++ i)
volumn[i] = in.nextInt();
for (int i = 1; i <= N; ++ i) {
for (int v = V; v >= 0; -- v) {
if (v - volumn[i] >= 0)
dp[v] = Max(dp[v], dp[v - volumn[i]] + value[i]);
}
}
System.out.println(dp[V]);
}
}
}
(二维dp)代码如下:
import java.util.*;
public class Main {
static final int MAX_N = 1000 + 10;
static int[] value = new int[MAX_N];
static int[] volumn = new int[MAX_N];
static int[][] dp = new int[MAX_N][MAX_N];
public static int Max(int a, int b) {
return a > b ? a : b;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int case_times = in.nextInt();
while (case_times-- != 0) {
int N, V;
for (int i = 0; i < MAX_N; ++ i) {
for (int j = 0; j < MAX_N; ++ j)
dp[i][j] = 0;
}
N = in.nextInt();
V = in.nextInt();
for (int i = 1; i <= N; ++ i)
value[i] = in.nextInt();
for (int i = 1; i <= N; ++ i)
volumn[i] = in.nextInt();
for (int i = 1; i <= N; ++ i) {
for (int v = 0; v <= V; ++ v) {
if (v - volumn[i] >= 0)
dp[i][v] = Max(dp[i-1][v], dp[i-1][v - volumn[i]] + value[i]);
else
dp[i][v] = dp[i-1][v];
}
}
System.out.println(dp[N][V]);
}
}
}
hdoj 2620 Bone Collector(0-1背包)的更多相关文章
- HDU 2602 Bone Collector 0/1背包
题目链接:pid=2602">HDU 2602 Bone Collector Bone Collector Time Limit: 2000/1000 MS (Java/Others) ...
- hdoj 2602 Bone Collector 【01背包】
意甲冠军:给出的数量和袋骨骼的数,然后给每块骨骼的价格值和音量.寻求袋最多可容纳骨骼价格值 难度;这个问题是最基本的01背包称号,不知道的话,推荐看<背包9说话> AC by SWS 主题 ...
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...
- hdu2602 Bone Collector(01背包) 2016-05-24 15:37 57人阅读 评论(0) 收藏
Bone Collector Problem Description Many years ago , in Teddy's hometown there was a man who was call ...
- hdu 2602 Bone Collector(01背包)模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...
- HDU2602 Bone Collector 【01背包】
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 2602 - Bone Collector(01背包)解题报告
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU2602 Bone Collector(01背包)
HDU2602 Bone Collector 01背包模板题 #include<stdio.h> #include<math.h> #include<string.h&g ...
随机推荐
- mysql--自动增长
create table teacher( t_id int primary key auto_increment, #auto_increment 自动增长 需要整型,还需要索引 t_name va ...
- EBS OAF中如何在多行表中实现附件功能
EBS OAF中如何在多行表中实现附件功能 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 在OAF中使用附件功能之前,要先明白Entity( ...
- Android存储小结
转自:http://www.liaohuqiu.net/cn/posts/storage-in-android/ android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的 ...
- Android 图片平铺效果实现的3种方法
Html中平铺的效果,那么我们都是怎么样才能实现的那,我们其实主要用到的就是api,我们一开始new一个bitmap,就可以了,那么我们就来说说第二种方法,那就在用到了xml,上面我们说了两个方法,但 ...
- Activity之间定时跳转
起源:很多应用在打开时,首先会加载欢迎页面,经过几秒后再跳转到主页面. 下面,我通过两种不同的方式来实现页面的定时跳转. 第一种方式: 通过Timer类的schedule方法. 实现从MainActi ...
- J2SE知识点摘记(二十)
List 1.3.1 概述 前面我们讲述的Collection接口实际上并没有直接的实现类.而List是容器的一种,表示列表的意思.当我们不知道存储的数据有多少的情况,我们就可以使用Li ...
- Cortex-M3 .s启动文件分析
1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器软件接口标准. 2. CMSIS标准的文件结构: a) ...
- 自绘Tab控件
自绘tab按钮效果图如下: 使用例子: MyTabControl *tabControl = NULL; tabControl = new MyTabControl();tabControl-> ...
- delphi 编码速度提升技能
效率,是一个永恒的主题. 本文重点强调 delphi ide 中的编码速度技能 一.TForm 窗口重用 当您在写一个管理类软件的时候,有大量的操作窗口,这些窗口会有大量共性.窗口重用就会发挥很大的作 ...
- umount.nfs device busy day virsh extend diskSpace, attachDisk
KVM中linux虚拟机的硬盘添加方法 最近虚拟机中运行的东西比较多,很多.而刚启动的时候虚拟机分配的磁盘比较少,随着日志还有平时的上传文件的积累,磁盘空间报警了.网上查了下资料,自己也做了下实验.总 ...