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 ...
随机推荐
- STL源码剖析 迭代器(iterator)概念与编程技法(三)
1 STL迭代器原理 1.1 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...
- Android StrictMode介绍
转:http://www.blueowls.net/android-strictmode%E4%BB%8B%E7%BB%8D/ /** * enables "strict mode" ...
- 64位windows8的 IIS运行32位COM组件报错的解决
浏览时报错如下: Microsoft VBScript 运行时错误 错误 '800a01ad'ActiveX 部件不能创建对象: 'sqlcomp.FileSystemObject'/config.a ...
- Nginx 拒绝指定IP访问
来源 : http://www.ttlsa.com/nginx/nginx-deny-ip-access/ 闲来无事,登陆服务器,发现有个IP不断的猜测路径.试图往服务器上传文件(木马).于是查看 ...
- NOI2015 Day1
NOI2015 Day1 程序自动分析 题目描述:给出等式或不等式\(n\)条,问\(n\)条式子是否成立. solution: 用并查集处理等式,在判断不等式是否成立. 时间复杂度:\(O(n)\) ...
- 用showModalDialog写的简单弹出框传参与反参
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]) sURL -- 必选参数,类型:字符串.用来指定对话框要 ...
- SQL学习之去重复查询
下面是一张表的数据
- eclipse使用技巧---使用正则表达式查找替换
1,Eclipse ctrl+f 打开查找框2,选中 Regular expressions (正则表达式) 去掉/* */(eclipse) /\*(.|[\r\n])*?\*/去掉/ ...
- Putty以及adb网络调试
1.什么是SSH? SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. 传 ...
- 我的学习笔记之API-Guides翻译------AppComponent_Activites
10.26第一天开始:贵在坚持,边看遍整理 一个应用程序通常由多个Activity组成,它们之间是松耦合的关系.特别的,有一个Activity作为app的主Activity,当app首次启动时呈现给用 ...