题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2602

Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 77450    Accepted Submission(s): 32095

Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
 
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
 
Output
One integer per line representing the maximum of the total value (this number will be less than 231).
 
Sample Input
1
5 10
1 2 3 4 5
5 4 3 2 1
 
Sample Output
14
 
Author
Teddy
 
Source
 
分析:
经典的01背包问题,每个物品只有两种状态,放还是不放
dp[i][j]:即前面i件物品放入一个容量为j的背包可以获得的最大价值
状态转移方程:
dp[i][j]=dp[i-1][j]  j<w[i]
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]     j>=w[i]
 
注意:
1.先输入的是物品的价值,而不是重量,题目中好像说反了
2.背包容量可以为0,物品的重量也可以为0
关于第2点的测试数据:
输入
1
5 0
2 4 1 5 1
0 0 1 0 0
输出
12
 
从前往后遍历二维数组
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,c;
scanf("%d %d",&n,&c);
int v[n+],w[n+];
for(int i=;i<=n;i++)
{
scanf("%d",&v[i]);
}
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
}
int dp[n+][c+];
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
for(int j=;j<=c;j++)
{
if(w[i]<=j)//表示第i个物品放入背包中
{
dp[i][j]=max(dp[i-][j],dp[i-][j-w[i]]+v[i]);//第i个物品放入之后,那么前面i-1个物品可能会因为剩余空间不够无法放入
}else//表示第i个物品不放入背包
{
dp[i][j]=dp[i-][j];//如果第i个物品不放入背包,那么此时的最大价值与放前面i-1个物品的值相等
}
}
}
printf("%d\n",dp[n][c]);
}
return ;
} /*
3
5 10
6 3 5 4 6
2 2 6 5 4
5 10
1 2 3 4 5
5 4 3 2 1
5 0
2 4 1 5 1
0 0 1 0 0 15
14
12
*/
 从后往前遍历二维数组
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,c;
scanf("%d %d",&n,&c);
int v[n+],w[n+];
for(int i=;i<=n;i++)
{
scanf("%d",&v[i]);
}
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
}
int dp[n+][c+];
memset(dp,,sizeof(dp));
for(int j=;j<=c;j++)
{
if(j>=w[n])
{
dp[n][j]=v[n];
}else
{
dp[n][j]=;
}
}
for(int i=n-;i>=;i--)
{
for(int j=;j<=c;j++)
{
if(j>=w[i])
{
dp[i][j]=max(dp[i+][j],dp[i+][j-w[i]]+v[i]);
}
else
{
dp[i][j]=dp[i+][j];
}
}
}
printf("%d\n",dp[][c]);
}
return ;
} /*
3
5 10
6 3 5 4 6
2 2 6 5 4
5 10
1 2 3 4 5
5 4 3 2 1
5 0
2 4 1 5 1
0 0 1 0 0 15
14
12
*/

二者其实是一个方法,只是遍历二维数组的方向有点不同

HDU 2602 Bone Collector(经典01背包问题)的更多相关文章

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

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

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

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

  3. 题解报告:hdu 2602 Bone Collector(01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Problem Description Many years ago , in Teddy’s ...

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

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

  5. hdu 2602 Bone Collector(01背包)

    题意:给出包裹的大小v,然后给出n块骨头的价值value和体积volume,求出一路下来包裹可以携带骨头最大价值 思路:01背包 1.二维数组(不常用 #include<iostream> ...

  6. HDU - 2602 Bone Collector(01背包讲解)

    题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组: ...

  7. HDU 2602 Bone Collector 0/1背包

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

  8. HDU 2602 Bone Collector

    http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Others) ...

  9. HDU 2602 Bone Collector (01背包问题)

    原题代号:HDU 2602 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 原题描述: Problem Description Many yea ...

随机推荐

  1. DOM节点树和元素树--深度遍历

    我们在阅读JS高级程序设计的时候,提到了节点树的概念.比如说: elem.parentNode---找elem的父节点: elem.childNodes---找elem的所有的直接子节点: elem. ...

  2. 【canvas系列】canvas实现“ 简单的Amaziograph效果”--画对称图【强迫症福利】

    标题很难引人入胜,先放个效果图好了 如果图片吸引不了你,那我觉得也就没啥看的了. demo链接: https://win7killer.github.io/demo_set/html_demo/can ...

  3. CSS - 伪类和伪元素的区别

    伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: CSS伪类 (P ...

  4. ios 9 http

    记录: <key>NSAppTransportSecurity</key>     <dict>    <key>NSAllowsArbitraryLo ...

  5. 卷积神经网络(CNN)在语音识别中的应用

    前言 总结目前语音识别的发展现状,dnn.rnn/lstm和cnn算是语音识别中几个比较主流的方向.2012年,微软邓力和俞栋老师将前馈神经网络FFDNN(Feed Forward Deep Neur ...

  6. hadoop HA集群搭建步骤

      NameNode DataNode Zookeeper ZKFC JournalNode ResourceManager NodeManager node1 √   √ √   √   node2 ...

  7. centos7 安装mariadb最新版并配置

    打开http://mirrors.aliyun.com/,查找mariadb,然后拼装地址http://mirrors.aliyun.com/mariadb/yum打开,点开你想要的版本,选择你的操作 ...

  8. 浅谈maven中的scope,systempath

    scope  maven中scope的默认值是compile scope的分类 1)compile 默认是compile.compile表示被依赖项目需要参与当前项目的编译,包括后续的测试,运行周期也 ...

  9. PSP软件开发过程

    1. 引言 这是为了编写psp系统的软件需求分析,主要按照提供的相关需求和功能. 1.1 项目风险 风险承担者包括: 任务提出者:承担任务不能完全按照想象的做出,投入等: 软件开发者:可能不能按时交付 ...

  10. Centos 安装Dokuwiki

    一.前言 DokuWiki是一个开源wiki引擎程序,运行于PHP环境下.DokuWiki程序小巧而功能强大.灵活,适合中小团队和个人网站知识库的管理. 二.环境 在centos6 下安装apache ...