算法基础——动态规划之0-1背包问题

本文详细介绍了0-1背包问题的暴力搜索解法及其高复杂度,然后探讨了带备忘录的递归优化方法,并进一步阐述了动态规划的求解思路,通过二维数组自底向上计算得到最优解。文章最后比较了动态规划与分治法的区别,强调了动态规划在求解最优解问题中的应用。
摘要由CSDN通过智能技术生成
  • 问题描述
    0-1背包问题描述
    解决这个问题,最先想到的一定是暴力搜索:假设一共有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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值