-
问题描述
解决这个问题,最先想到的一定是暴力搜索:假设一共有n件商品,每件商品都有选择或不选两种状态,所有的选择方式为——从n件商品任取一件、任取两件、’’’、任取n件, 即共有Cn1 + Cn2 + Cn3 +…+Cnn 种选择方式。其中某些选择方式会超出背包的容量,把这样的选择方式剪掉,在剩余合法的选择方式中找到商品总价值最高的组合。我们采用递归的方式来进行暴力搜索:对于n件商品的情况,第i件商品的重量为w[i],价值为v[i],背包容量为c,计算n件商品的最高价值选择P(n,c)即为:
max{P(n-1,c-w[n])+v[n], P(n-1, c)}
P(n-1,c-w[n])+v[n]: 将第n件物品放入背包时的最高价值选择(选择了第n件物品后背包容量-w[n],再去找前n-1件物品的最高价值P(n-1,c-w[n]))
P(n-1, c):不选择第n件物品,背包容量仍为c不变。通过此递归式可计算出最高价值选择,伪代码及Golang实现如下:
const negInfinity = -1000
/*暴力搜索的求解方式(递归)*/
func KnapsackSR(w []int, v []int, flag []int,n int, c int) int {
// 背包体积为c,且在前n个商品中做选择
//递归边界
if c < 0 {
//背包容量不足
return negInfinity
}
if n <= 0 {
//商品不足 决策已经完成
return 0
}
getN := KnapsackSR(w,v,flag,n-1,c-w[n])+v[n]
noN := KnapsackSR(w,v,flag,n-1