算法与数据结构-背包问题

01背包问题

题目

有N件物品和一个容量为M的背包,每种物品只可以取一件。第i件物品的费用是c[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。

分析

这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][j]表示前i件物品恰放入一个容量为j的背包可以获得的最大价值。则其状态转移方程便是:

f[i][j]=max{f[i-1][j],f[i-1][j-c[i]]+v[i]}

优化空间复杂度

即改用一维数组f[j]存储第i个物品时剩余空间为j时的背包的最大价值。

注意到j-c[i]<j这个关系,当j=0……M顺序推f[j],则后面的到的f[j]将会使用到当前i状态下新生成的f[j-c[i]],而不是我们所需的i-1状态时的f[j-c[i]]。

因此,在每次主循环中我们以j=M……0顺序推f[j],这样才能保证推f[j]时f[j-c[i]]保存的是状态f[i-1][j-c[i]]的值。

参考代码

/*
 * n:物品种类 每种只能选取一种
 * 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值