题解报告: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背包)的主要内容,如果未能解决你的问题,请参考以下文章
hdu2602Bone Collector ——动态规划(0/1背包问题)