题目
给定一组物品和一个背包,每个物品有自己的价值和重量,背包的容量为K。每个物品只能使用一次,求背包容量下能装物品的最大价值。
给定一组int[] values数组和int[] weight数组表示物品的价值和重量,给定K为背包容量。
解题思路
根据全排列的思想,求出所有物品的组合,找出其中的一种组合,该组合的重量之和小于等于背包容量且价值是所有组合中最大的。
例如:电脑[6,6],手机[3,2],鞋子[2,4],背包容量K为7
所有的组合为
0 0 0 - 什么都不选,价值0,容量0
0 0 1 - 只选鞋子,价值2,容量4
0 1 0 - 只选手机,价值3,容量2
0 1 1 - 选手机和鞋子,价值5,容量6
1 0 0 - 只选电脑,价值6,容量6
1 0 1 - 选电脑和鞋子,价值8,容量10(容量溢出)
1 1 0 - 选电脑和手机,价值9,容量8(容量溢出)
1 1 1 - 都选,价值11,容量12(容量溢出)
所以根据所有的组合,得出最佳的组合为只选择电脑价值为6。
代码
int res = 0;
//K表示背包容量,cur表示当前选择了的物品的容量
void rec(int[] values,int[] weights,int index,int K,int curWeight,int curValue){
if(index == values.length){
//选择完了物品
if( curWeight <= K){
res = Math.max(res,curValue);
}
return;
}
//容量超出了。
//这里不判断也可以,到使用完物品也会判断一次。如果不写下面的判断可以出现所有的组合结果
//if(curWeight > K){
// return;
//}
//不选择当前物品
rec(values,weights,index+1,K,curWeight,curValue);
//选择当前物品
rec(values,weights,index+1,K,curWeight + weights[index],curValue + values[index]);
}