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

Posted 霜雪千年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解报告:hdu Bone Collector(01背包)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602

问题描述

   许多年前,在泰迪的家乡有一个叫做“骨头收藏家”的男人。这个男人喜欢收集各种各样的骨头,比如狗的,牛的,他也去了坟墓... 骨头收藏家有一个体积为V的大袋子,在收集行程中有很多骨头,显然,不同的骨骼具有不同的价值和不同的体积,现在给出每次骨头在旅途中的价值,你能计算一下超出骨头收集器可以获得的最大总价值?

输入

   第一行包含一个整数T,即个案数。 其次是T个案例,每个案例三行,第一行包含两个整数N,V(N <= 1000,V <= 1000),表示骨骼的数量和他的包的体积。第二行包含N个代表每个骨骼值的整数。第三行包含N个整数,代表每个骨骼的体积。  

输出

   每行一个整数,代表总值的最大值(该数字将小于2^31)。  

示例输入

1

5 10

1 2 3 4 5

5 4 3 2 1  

示例输出

14

解题思路:简单的01背包(dp)。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int value[1005],weight[1005],dp[1005];//dp数组始终记录当前体积的最大价值
 4 int main()
 5 {
 6     int T,N,V;
 7     cin>>T;
 8     while(T--){
 9         cin>>N>>V;
10         for(int i=0;i<N;i++)cin>>value[i];//输入价值
11         for(int i=0;i<N;i++)cin>>weight[i];//输入体积
12         memset(dp,0,sizeof(dp));//初始化
13         for(int i=0;i<N;i++){    //个数
14             for(int j=V;j>=weight[i];j--) //01背包
15                 dp[j]=max(dp[j],dp[j-weight[i]]+value[i]); //比较放入i物体后的价值与不放之前的价值,记录大的值
16         }
17         cout<<dp[V]<<endl;//输出总体积的最大值
18     }
19     return 0;
20 }

以上是关于题解报告:hdu Bone Collector(01背包)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2602 Bone Collector 0/1背包

HDU2602Bone Collector 简单0-1背包

hdu2602Bone Collector ——动态规划(0/1背包问题)

hdu 2602 Bone Collector 01背包模板

HDU 2602: Bone Collector

题解报告:hdu 1010 Tempter of the Bone