首页 > 其他 > 详细

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

时间:2018-04-14 10:48:00      阅读:216      评论:0      收藏:0      [点我收藏+]

题目链接: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背包)

原文:https://www.cnblogs.com/acgoto/p/8830553.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!