动态规划----背包问题(完全背包问题)

该博客讨论了完全背包问题的动态规划解决方案,与01背包的区别在于物品可以无限取。博主分析了使用01背包思路解完全背包会导致较高的时间复杂度,并提出了一种优化方法,借鉴01背包的空间优化策略,避免物品被重复选取,从而降低复杂度。

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

例题

  有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的耗费的空间是Ci,得到的价值是Wi。求解:将哪些物品装入背包,可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。

分析

  完全背包和01背包的区别就在于物品可以无限取,而01背包的每种物品只有一件(01背包可以参考我之前的文章);
  若按照01背包的思路来求解的话:也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……直至取⌊ V C i \frac{V}{C_i} CiV⌋件等很多种。那么可以转化为01背包的问题,假设每个物品有⌊ V C i \frac{V}{C_i} CiV⌋件再通过01背包的动态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);来解
  但是这样做有一个问题:虽然这跟01背包问题一样有O(V N)个状态需要求解,但求解每个状态的时间已经不是常数了,求解状态F[i; v]的时间是O( V C i \frac{V}{C_i} CiV),总的复杂度可以认为是O( N V − V C i NV - \frac{V}{C_i} NVCiV),是比较大的(此时 N = V C i N=\frac{V}{C_i} N=CiV)。
  那么优化就来啦:还记得01背包优化空间复杂度的优化方法吗?这种方法逆推的原因为的就是防止物品被重复选取,则顺推的时候顺便就可以解决掉这个问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值