Bone Collector
原题连接:
点击打开链接
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15290 Accepted Submission(s): 6055
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 ?
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.
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 2
31).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
Author
Teddy
Source
Recommend
lcy
1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <cmath> 5 #include <cstring> 6 #include <algorithm> 7 #include <map> 8 #include <vector> 9 #include <queue> 10 #include <stack> 11 #define LL long long 12 #define MAXI 2147483647 13 #define MAXL 9223372036854775807 14 #define eps (1e-8) 15 #define dg(i) cout << "*" << i << endl; 16 17 using namespace std; 18 19 int vol[1001], val[1001], maxVal[1001][1001]; 20 21 int max (const int a, const int b) {return a > b ? a : b;} 22 23 int main() 24 { 25 int T, N, V, ans; 26 scanf("%d", &T); 27 while(T--) 28 { 29 scanf("%d %d", &N, &V); 30 for(int i = 1; i <= N; ++i) scanf("%d", &val[i]); 31 for(int i = 1; i <= N; ++i) scanf("%d", &vol[i]); 32 if(V == 0) 33 { 34 ans = 0; 35 for(int i = 1; i <= N; ++i) 36 if (!vol[i]) ans += val[i]; 37 } 38 else if(N == 0) ans = 0; 39 else 40 { 41 for(int i = 1; i <= N; ++i) 42 { 43 for(int j = 0; j <= V; ++j) 44 { 45 //if(i == 0 || j == 0) maxVal[i][j] = 0; 46 //else…… 47 /*上面的语句是错误的,当j等于0时,表明此时背包容量为0,按理说不能装任何东西,故而 48 maxVal[i][0] = 0,但是,在这题中,物品的体积可为0,故此背包容量为0但是还是可以装物品。 49 可以先设maxVal[i][0] = 0,但是由于使用if-else语句,设maxVal[i][0] = 0之后就不执行了, 50 无法更新maxVal[i][0] = 0*/ 51 if(vol[i] > j) maxVal[i][j] = maxVal[i - 1][j]; 52 else maxVal[i][j] = max(maxVal[i - 1][j], maxVal[i - 1][j - vol[i]] + val[i]); 53 } 54 } 55 ans = maxVal[N][V]; 56 } 57 printf("%d\n", ans); 58 } 59 return 0; 60 }