问题:给定一组多个(n)物品,每种物品都有自己的重量(Wi)和价值(Vi),每种物品至多选择一个,在限定可承受总重量(C)的背包内,要想背包内物品的总价值最高,应该选择那几件物品?
使用递归的思路: 选择的物品分两种情况:1.物品重要超过容量,则不能放入背包,2.物品重量小于背包容量,要么放入的则会满足最优解,要么不放入会满足最优解答。
n:物品数量,c:背包容量,w为物品对应的重量,v为对应的价值
public int getMaxValue(int n, int c, int [] w, int []v ) {
if (n == 1) {
//递归出口;只有一件物品,要么放入,要么不放入
if (c > w[0]) {
return w[0];
} else {
return 0;
}
}
if (c > w[n-1]) {
//可以放入该物品时,需要抽象选择,两种情况中最优解答
return Math.max(getMaxValue(n-1, c-w[n-1], w, v) + v[n-1],
getMaxValue(n-1, c, w, v));
} else {
//不可以放入时则只有一种选择
return getMaxValue(n-1, c, w, v);
}
}
背包问题时典型的动态规划问题,动态规划主要核心在于拆分问题,找到状态转移方程,也就是递推表达式,例如当只剩最后一个物品,此时没有多余的物品能够选择了,就只能选择此物品,而选择此问题有两种情况,分情况进行考虑就可以得到解决办法,当然这只是吹牛逼的啊,复杂的动规问题还有很多啊,下一期计划啃寻找两个有序数组的中位数,看看能不能搞明白