题目链接: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)代码如下:

  1. import java.util.*;
  2.  
  3. public class Main {
  4. static final int MAX_N = 1000 + 10;
  5. static int[] value = new int[MAX_N];
  6. static int[] volumn = new int[MAX_N];
  7. static int[] dp = new int[MAX_N];
  8.  
  9. public static int Max(int a, int b) {
  10. return a > b ? a : b;
  11. }
  12. public static void main(String[] args) {
  13. Scanner in = new Scanner(System.in);
  14.  
  15. int case_times = in.nextInt();
  16. while (case_times-- != 0) {
  17. int N, V;
  18.  
  19. for (int i = 0; i < MAX_N; ++ i)
  20. dp[i] = 0;
  21. N = in.nextInt();
  22. V = in.nextInt();
  23. for (int i = 1; i <= N; ++ i)
  24. value[i] = in.nextInt();
  25. for (int i = 1; i <= N; ++ i)
  26. volumn[i] = in.nextInt();
  27. for (int i = 1; i <= N; ++ i) {
  28. for (int v = V; v >= 0; -- v) {
  29. if (v - volumn[i] >= 0)
  30. dp[v] = Max(dp[v], dp[v - volumn[i]] + value[i]);
  31. }
  32. }
  33. System.out.println(dp[V]);
  34. }
  35. }
  36. }

(二维dp)代码如下:

  1. import java.util.*;
  2.  
  3. public class Main {
  4. static final int MAX_N = 1000 + 10;
  5. static int[] value = new int[MAX_N];
  6. static int[] volumn = new int[MAX_N];
  7. static int[][] dp = new int[MAX_N][MAX_N];
  8.  
  9. public static int Max(int a, int b) {
  10. return a > b ? a : b;
  11. }
  12. public static void main(String[] args) {
  13. Scanner in = new Scanner(System.in);
  14.  
  15. int case_times = in.nextInt();
  16. while (case_times-- != 0) {
  17. int N, V;
  18.  
  19. for (int i = 0; i < MAX_N; ++ i) {
  20. for (int j = 0; j < MAX_N; ++ j)
  21. dp[i][j] = 0;
  22. }
  23. N = in.nextInt();
  24. V = in.nextInt();
  25. for (int i = 1; i <= N; ++ i)
  26. value[i] = in.nextInt();
  27. for (int i = 1; i <= N; ++ i)
  28. volumn[i] = in.nextInt();
  29. for (int i = 1; i <= N; ++ i) {
  30. for (int v = 0; v <= V; ++ v) {
  31. if (v - volumn[i] >= 0)
  32. dp[i][v] = Max(dp[i-1][v], dp[i-1][v - volumn[i]] + value[i]);
  33. else
  34. dp[i][v] = dp[i-1][v];
  35. }
  36. }
  37. System.out.println(dp[N][V]);
  38. }
  39. }
  40. }

hdoj 2620 Bone Collector(0-1背包)的更多相关文章

  1. HDU 2602 Bone Collector 0/1背包

    题目链接:pid=2602">HDU 2602 Bone Collector Bone Collector Time Limit: 2000/1000 MS (Java/Others) ...

  2. hdoj 2602 Bone Collector 【01背包】

    意甲冠军:给出的数量和袋骨骼的数,然后给每块骨骼的价格值和音量.寻求袋最多可容纳骨骼价格值 难度;这个问题是最基本的01背包称号,不知道的话,推荐看<背包9说话> AC by SWS 主题 ...

  3. HDOJ(HDU).2602 Bone Collector (DP 01背包)

    HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...

  4. 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 ...

  5. hdu 2602 Bone Collector(01背包)模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...

  6. HDU2602 Bone Collector 【01背包】

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. hdu 2602 - Bone Collector(01背包)解题报告

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. HDU2602 Bone Collector(01背包)

    HDU2602 Bone Collector 01背包模板题 #include<stdio.h> #include<math.h> #include<string.h&g ...

随机推荐

  1. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  2. Android StrictMode介绍

    转:http://www.blueowls.net/android-strictmode%E4%BB%8B%E7%BB%8D/ /** * enables "strict mode" ...

  3. 64位windows8的 IIS运行32位COM组件报错的解决

    浏览时报错如下: Microsoft VBScript 运行时错误 错误 '800a01ad'ActiveX 部件不能创建对象: 'sqlcomp.FileSystemObject'/config.a ...

  4. Nginx 拒绝指定IP访问

    来源 : http://www.ttlsa.com/nginx/nginx-deny-ip-access/   闲来无事,登陆服务器,发现有个IP不断的猜测路径.试图往服务器上传文件(木马).于是查看 ...

  5. NOI2015 Day1

    NOI2015 Day1 程序自动分析 题目描述:给出等式或不等式\(n\)条,问\(n\)条式子是否成立. solution: 用并查集处理等式,在判断不等式是否成立. 时间复杂度:\(O(n)\) ...

  6. 用showModalDialog写的简单弹出框传参与反参

    vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]) sURL -- 必选参数,类型:字符串.用来指定对话框要 ...

  7. SQL学习之去重复查询

    下面是一张表的数据

  8. eclipse使用技巧---使用正则表达式查找替换

    1,Eclipse ctrl+f 打开查找框2,选中 Regular expressions (正则表达式) 去掉/* */(eclipse)        /\*(.|[\r\n])*?\*/去掉/ ...

  9. Putty以及adb网络调试

    1.什么是SSH? SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. 传 ...

  10. 我的学习笔记之API-Guides翻译------AppComponent_Activites

    10.26第一天开始:贵在坚持,边看遍整理 一个应用程序通常由多个Activity组成,它们之间是松耦合的关系.特别的,有一个Activity作为app的主Activity,当app首次启动时呈现给用 ...