给定两个长度都为N的数组weights和values,
weights[i]和values[i]分别代表i号物品的重量和价值。
给定一个正数bag,表示一个载重bag的袋子,
你装的物品不能超过这个重量。
返回你能装下最多的价值是多少?
分析:这是一道典型的从左往右模型
对于第i个物品有两种情况
要了第i个物品,到第i+1个物品做决定
没要第i个物品,到第i+1个物品做决定
取两种情况的价值大的返回
代码:
public class Class1 {
public static void main(String[] args) {
int[] weights = {10,20,30,40,50,20,30,30,40};
int[] values = {200,120,300,20,400,400,500,800,900};
int i = process1(weights, values, 0, 0, 0, 160);
int process1 = process(weights, values, 0, 0, 160);
System.out.println(i == process1);
System.out.println("process1 = " + process1);
System.out.println("i = " + i);
}
/**
* 背包问题
* @param weights 物体重量数组
* @param values 物体价值数组
* @param position 第i个位置
* @param value 总价值
* @param totalWeight 总重量
* @param bag 背包重量
* @return
*/
private static int process1(int[] weights,int[] values,int position,int value,int totalWeight,int bag){
if(position == weights.length){
return value;
}
int value1 = process1(weights, values, position + 1, value, totalWeight, bag);
int tempValue = value + values[position];
int tempWeight = totalWeight + weights[position];
int value2 = 0;
if(tempWeight<=bag) {//如果要了第i个物体重量超了直接没机会
value2 = process1(weights, values, position + 1, tempValue, tempWeight, bag);
}
return value1 > value2 ? value1 : value2;
}
private static int process(int[] w,int[] v,int index,int alreadyW,int bag){
if(alreadyW > bag){
return -1;
}
if(index == w.length){
return 0;
}
int p1 = process(w,v,index+1,alreadyW,bag);
int p2next = process(w,v,index+1,alreadyW+w[index],bag);
int p2 = -1;
if(p2next != -1){
p2 = v[index] + p2next;
}
return Math.max(p1,p2);
}
}