背包问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
5 10
2 8
3 9
样例输出
65
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* [实训] 编程课堂实训习题:算法解析--背包问题
* @author WillyLiu
* 2013-5-2下午06:08:44
* TODO
*/
public class Main4 {
public static void main(String[] args) {
Scanner scanner=new Scanner (System.in);
while(scanner.hasNext()) {
/**
* N表示放入书包的物品个数
*/
int N=scanner.nextInt();
/**
* 书包能装的最大重量
*/
int W=scanner.nextInt();
/**
* key表示物品的价值,value表示物品的质量
*/
Map<Integer, Integer> map=new HashMap<Integer, Integer>();
Integer value[]=new Integer[N];
for(int i=0;i<N;i++){
int v=scanner.nextInt();//价值
assert v>=1;
int m=scanner.nextInt();//质量
assert m<=10;
map.put(v, m);
value[i]=v;
}
/**
* 对价值进行排序
*/
Arrays.sort(value,0,N);
int sumValue=Main4.SumValue(W, map, value, 0, N-1);
System.out.println(sumValue);
}
}
/**
* 计算出背包能装的最大价值总和
* @param W 书包能容纳的最大质量
* @param map 存放一个物品的价值和质量
* @param value 存放物品价值的数组
* @param start 数组的开始位置
* @param end 数组的结束位置
* @return 返回书包能包装的最大价值综和
*/
public static int SumValue(int W,Map<Integer, Integer> map,Integer[] value,int start,int end) {
int sumValue=0;
if( start<=end && W -map.get(value[end])>= 0 ) {
sumValue=map.get(value[end])*value[end]+SumValue(W-map.get(value[end]), map, value, start, end-1);
}else if( start<=end ){
sumValue=W*value[end];
}
return sumValue;
}
}