题目链接:

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. c#如何判断两个对象是否相等

    在c#中判断对象相等,这是对引用类型进行判断,而不是对值类型,如果是对字符串,或者是数值进行判断相等只需要用==运算符就可以了. 对两个对象用==运算符,只能判断他们两个在内存中的地址是否一样的.   ...

  2. Jquery插件网站持续添加。。。

    Look Fro Less,Do More www.jq22.com

  3. 浏览器根对象window之操作方法

    1.1 不常用 alert:带有一条指定消息和一个OK按钮的警告框. confirm:带有指定消息和OK及取消按钮的对话框. prompt:可提示用户进行输入的对话框. print:打印网页. ope ...

  4. jsonp 返回以前必须要再转一次json

    public static void main(String[] args) {        String ajaxJsonStr = null;        AjaxJson ajaxJson ...

  5. owin Claims-based认证登录实现

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext c ...

  6. ORA-06512 问题解决

    SQL> select * from dba_role_privs where grantee='SUK';     GRANTEE GRANTED_ROLE ADMIN_OPTION DEFA ...

  7. Redis学习---Redis操作之其他操作

    全局有效的其他操作 save 强制将内存/缓存中的key刷到硬盘上 ------------------------------------------------------------------ ...

  8. Python学习---IO的异步[asyncio模块(no-http)]

    Asyncio进行异步IO请求操作: 1. @asyncio.coroutine  装饰任务函数 2. 函数内配合yield from 和装饰器@asyncio.coroutine 配合使用[固定格式 ...

  9. java.lang.verifyerror:bad type on orerand stack

    问题: junit测试的时候报这个错:java.lang.verifyerror:bad type on orerand stack 原因:(多种,自行逐个排查) 1.class not find 引 ...

  10. 内置数据结构(list)

    列表.元组.字符串.字典和集合是python内置的数据结构,也可以叫内置容器.前3个是线性结构,线性结构可以切片操作.解包和封包操作. dir()方法可以查看对象拥有哪些属性和方法. help()方法 ...