问题描述:
有一个背包,它的容量为C(Capacity),现在有n种不同的物品,编号为0..n-1,其中每一件物品的重量为W(i),价值为v(i)。问可以向这个背包中盛放那些物品,使得在不超过背包容量的基础上,物品的总价值最大
使用递归解决问题的时候,要首先知道递归要解决怎样的问题,也就是说定义状态。首先有两个变量n个物品,容量为C的背包,所以:
F(n,C)考虑将n个物品放进容量为C的背包,使得价值最大。
状态转移方程:
F(i,c) = F(i-1,c)
= v(i)+F(i-1 , c-w(i))
考虑将i个物品放在容量为C的背包中,有两种选择(要么放入背包中,要么不放入背包中)。
对于不放入背包的情况,那些就是将n-1个物品放在容量为C的背包。
对于放入背包的情况,就是第i个物品的价值加上 i-1个物品放在容量为 c-w(i)容量的背包中
所以背包问题的解法就是求两种情况的最大值:
F(i,C) = max( F(i-1,c), v(i)+c-w(i) )
递归的解法:
class Solution {
//用[0..index]的物品,填充容积为C的背包获得最大价值
int bestValue(int[] w, int[] v, int index, int c){
//物品遍历完(所有都能放下),物品放不下的时候
if(index < 0 || c <= 0)
return 0;
//物品选择不放入背包,最大价值由除了这个物品外的其他物品来决定
int res = bestValue(w,