动态规划---01背包问题详解

与利润有关的背包问题.
问题描述:
一个商人带着一个能装m千克的背包去乡下收购货物,准备将这些货物卖到城里获利.
现有n种货源,且知第i种货物有wi千克,可获利pi元.请编写算法帮助商人收购货物,以获取更高的利润.

算法思路:
我们可以将商品逐个放进去.每次求得重量允许范围内的最大利润,后面放进去的商品求解最大利润根据前面放进去的商品利润最优解计算.而且每一步的过程无后向性,即后面放进去的商品,不影响之前计算的放进去的最优解,所以可以采用动态规划来解决.

动态规划算法设计:
1)数据结构的选取.
使用变量m表示背包的最大容量,n为物品的数目.
一维数组w[],存储当前物品的质量.
一维数组p[],存储当前物品带来的利润.
动态规划过程f,采用二维数组表示f[i][j],i表示的是第i个物品,j表示的是当前背包的容量.
2)设计状态转移方程:
第一阶段:(从一件物品放入背包开始)
从第n件物品开始,j代表着背包的容量
两种情况:
1.第n件物品的质量大于当前背包的质量,即j=0,1,...,w[n]-1;
状态方程为:f[n][j]=0,j=0,1,2,...,w[n]-1
2.当前背包的质量大于等于第n件物品的质量
状态方程为:f[n][j]=p[n],j=w[n],w[n]+1,...,m
第二阶段:(决定第n-1件物品的取舍可能)
分两种情况:
1.选取第n-1件物品放入背包中,这时
f[n-1][j]=

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值