背包(0-1)问题(动态规划)

本文详细解析了背包问题的动态规划算法,通过建立矩阵M[N][C]来求解最大价值,介绍了如何判定装入了哪些物品,并分享了动态规划算法的实用小贴士。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背包容量是C,可容纳N件商品,每件商品要么放要么不放,商品的重量数组W[ ],价值数组V[ ]。

通过动态规划算法,建立矩阵M[N][C]。

M[i][j]的含义为,往背包里放从1~i的物品的最大价值,j为背包容量。

M[i][j]的有两种选择:一是,不放当前物品i,M[i-1][j];二是,放当前物品i,则值为

V[i]+M[i-1][j-W[i]]。也就是当前物品的价值加上,背包容量为j-W[i],放1~i-1物品的最大价值。

矩阵里的每个值都是子问题的最优解,也就是背包在容量为j,容纳物品为1-i的最大价值。

 

还有一个问题,如何判定装入了哪个物品,由矩阵生成过程,可以知道,当M[i][j] != M[i-1][j]时,放入了物品i。以此类推,可以得到所有放入背包中的物品。

关于动态规划的小贴士(摘自《算法图解》)

1、每种动态规划方案都涉及到网格;

2、单元格的值通常是你要优化的值,如背包问题中,单元格的值为商品的价值。

3、每个单元格都是一个子问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值