码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-04-14 11:15:01      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:out   font   using   收藏   turn   problem   pre   clu   案例   

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

标签:out   font   using   收藏   turn   problem   pre   clu   案例   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!