01背包问题
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 ?
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.
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
import java.util.ArrayList;
import java.util.Scanner;
/**
* Created by 95112 on 10/24/2017.
*/
public class BoneCollector {
public static void main(String[] args)
{
long[] dp;
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
ArrayList<Long> answers = new ArrayList<>();
while (T-- >0){
int N,V;
N = scanner.nextInt();
V = scanner.nextInt();
dp = new long[V+1];
dp[0] = 0;
int[] boneValue = new int[N];
int[] boneVolume = new int[N];
for (int i = 0 ; i< N;i++)
{
boneValue[i] = scanner.nextInt();
}
for (int i = 0 ;i < N;i++)
{
boneVolume[i] = scanner.nextInt();
}
for (int i = 0 ; i < N; i++){
for (int j=V ; j >= 0 ;j--){
if (boneVolume[i] <= j)
dp[j] = max(dp[j],dp[j - boneVolume[i]]+boneValue[i]);
else
break;
}
}
answers.add(dp[V]);
}
for (Long answer : answers){
System.out.println(answer);
}
}
public static long max(long a, long b){
if (a>b)
return a;
else
return b;
}
}