Bone Collector
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
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 231).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
思路:简单的动态规划,0-1背包问题
1,二维数组解法:
#include<stdio.h> #include<string.h> int a[1001][1001],va[1001],vo[1001]; int max(int x, int y) { return x>y?x:y; } int main() { int T,i,j,n,v; scanf("%d",&T); while(T--) { memset(a,0,sizeof(a)); scanf("%d%d",&n,&v); for(i = 0;i < n;i ++) scanf("%d",&va[i]); for(i = 0;i < n;i ++) scanf("%d",&vo[i]); for(i = 0;i <= v;i ++) { for(j = 0;j < n;j ++) { if(i>=vo[j]) a[i][j] = max(a[i][j-1],a[i-vo[j]][j-1]+va[j]); else a[i][j] = a[i][j-1]; } } printf("%d ",a[v][n-1]); } }
2,一维数组解法:
#include<stdio.h> #include<string.h> int a[1001],va[1001],vo[1001]; int max(int x, int y) { return x>y?x:y; } int main() { int T,i,j,n,v; scanf("%d",&T); while(T--) { memset(a,0,sizeof(a)); scanf("%d%d",&n,&v); for(i = 1;i <= n;i ++) scanf("%d",&va[i]); for(i = 1;i <= n;i ++) scanf("%d",&vo[i]); for(i = 1;i <= n;i ++) { for(j = v;j >= 0;j --) { if(j>=vo[i]) a[j] = max(a[j],a[j-vo[i]]+va[i]); else a[j] = a[j]; } } printf("%d ",a[v]); } }