当前位置: 首页 > wzjs >正文

公司网站建设的视频深圳整站全网推广

公司网站建设的视频,深圳整站全网推广,网站维护收费标准,linux网站管理面板目录 前置知识进入正题优化方法:二进制分解实战演练 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 python 【算法】动态规划专题⑥ —— 完全背包问题 python 进入正题 多重背包问题I https://www.acwing.com/problem/content/4/ 题目描述 有…

目录

  • 前置知识
  • 进入正题
  • 优化方法:二进制分解
  • 实战演练


前置知识


【算法】动态规划专题⑤ —— 0-1背包问题 + 滚动数组优化 python
【算法】动态规划专题⑥ —— 完全背包问题 python


进入正题


多重背包问题I https://www.acwing.com/problem/content/4/


题目描述

N N N 种物品和一个容量是 V V V 的背包。
i i i 种物品最多有 s i s_i si 件,每件体积是 v i v_i vi,价值是 w i w_i wi

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。

输入格式

第一行两个整数, N , V N,V NV,用空格隔开,分别表示物品种数和背包容积。
接下来 N N N 行,每行三个整数 v i , w i , s i v_i, w_i, s_i vi,wi,si,用空格隔开,分别表示第 i i i 种物品的体积、价值和数量。

输出格式

输出一个整数,表示最大价值。

数据范围

0 < N , V ≤ 100 0 \lt N, V \le 100 0<N,V100
0 < v i , w i , s i ≤ 100 0 \lt v_i, w_i, s_i \le 100 0<vi,wi,si100

输入样例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:

10

在多重背包问题中,对于每种物品,你不仅可以选择是否放入背包,而且对于每种物品还有一个限制,即该物品最多可以放入的数量。
与0/1背包和完全背包不同:我们需要对每个物品的数量限制进行处理。

基本实现:

n, v = map(int, i
nput().split())
dp = [[0] * (v + 1) for _ in range(n + 1)]
for i in range(1, n + 1):vi, wi, si = map(int, input().split())for j in range(1, v + 1):for k in range(min(si, j // vi) + 1):dp[i][j] = max(dp[i][j], dp[i - 1][j - k * vi] + k * wi)
print(dp[n][v])

时间复杂度为O(n*v*s),有没有优化的方法呢?


优化方法:二进制分解


为了提高效率,我们可以采用二进制优化的方法来处理物品的数量限制。
具体来说,对于第i种物品,我们将其数量mi拆分为若干组,每一组的数量分别为(1, 2, 4, …, res)
这样做的目的是让这些组合能够通过不同的组合方式表示从1到mi的所有数字。

例如,假设某物品的数量限制为13,那么我们可以将其拆分为:

  • 1 即(2^0)
  • 2 即(2^1)
  • 4 即(2^2)
  • 6 (13 - (1+2+4) = 6)

这样,我们就可以用这四个新的“物品”组合出任何从1到13的数量。比如:

  • 5 = 1 + 4
  • 7 = 1 + 2 + 4
  • 13 = 1 + 2 + 4 + 6

完成上述转换后,我们将问题转化为0-1背包问题,其中每组作为一个单独的“物品”。


实现步骤

  1. 对于每种物品,根据其数量mi进行二进制拆分,生成新的“物品”列表。
  2. 初始化dp数组,dp[0]通常初始化为0,因为当容量为0时无法放入任何东西。
  3. 遍历新生成的每个“物品”,然后从该物品的重量开始遍历到背包的容量C,更新dp数组。
    dp[j] = max(dp[j], dp[j-w[i]] + v[i]) 对于所有 j >= w[i]
    
  4. 最终,dp[C]将包含能够放入容量为C的背包中的最大价值。

注意

  • 使用二进制优化可以显著减少计算量,特别是在物品的数量限制较大的情况下。
  • 在实际实现时,需要注意边界情况的处理,如物品数量mi为0的情况。

通过这种方法,我们可以有效地解决多重背包问题,并找到在给定背包容量下可获得的最大价值。



好了,实际运用的时候到了

实战演练


多重背包问题II https://www.acwing.com/problem/content/5/

题目描述

N N N 种物品和一个容量是 V V V 的背包。
i i i 种物品最多有 s i s_i si 件,每件体积是 v i v_i vi,价值是 w i w_i wi

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。

输入格式

第一行两个整数, N , V N,V NV,用空格隔开,分别表示物品种数和背包容积。

接下来有 N N N 行,每行三个整数 v i , w i , s i v_i, w_i, s_i vi,wi,si,用空格隔开,分别表示第 i i i 种物品的体积、价值和数量。

输出格式

输出一个整数,表示最大价值。

数据范围

0 < N ≤ 1000 0 \lt N \le 1000 0<N1000
0 < V ≤ 2000 0 \lt V \le 2000 0<V2000
0 < v i , w i , s i ≤ 2000 0 \lt v_i, w_i, s_i \le 2000 0<vi,wi,si2000

输入样例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:

10

本题数据范围增强了,考查多重背包的二进制优化方法。


code:

n, v = map(int, input().split())
v_w = []  # 存储物品的体积和价值的二进制分解
for i in range(1, n + 1):vi, wi, si = map(int, input().split())k = 1while si >= k:v_w.append((vi * k, wi * k))  # 二进制分解si -= kk *= 2# 处理剩余的部分if si > 0:v_w.append((vi * si, wi * si))dp = [0] * (v + 1)  # 滚动数组优化
for i, (vi, wi) in enumerate(v_w):for j in range(v, vi - 1, -1):dp[j] = max(dp[j], dp[j - vi] + wi)
print(dp[v])

时间复杂度优化为O(n*v*logs)


再进一步,利用单调队列维护窗口内最大值,避免重复计算
可以将时间复杂度优化为O(n*v)
在此就不赘述了,属于进阶技巧,后续会更新


END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

http://www.dtcms.com/wzjs/159105.html

相关文章:

  • wordpress子插件免费seo网站推广
  • 营销网站建设流程图百度最怕哪个投诉电话
  • 建一个营销网站多少钱seo工具包
  • 免费的站内推广方式有哪些b站推广网站2024下载
  • 网站备案全国合作拍照点游戏代理加盟
  • 北京建设规划许可证网站微信指数查询
  • 西安高校定制网站建设公司推荐南京网站排名提升
  • 建设银行潮州分行网站深圳网站提升排名
  • 网站建设优化学习公司百度官网优化
  • 建站之星用做什么网站免费网站建设哪个好
  • 蚌埠哪有做网站的软件优化
  • 提升审美的网站百度贴吧怎么发广告
  • 国外科技类网站网络站点推广的方法有哪些
  • 新疆建设工程信息网查询seo快排公司哪家好
  • 怎样免费做彩票网站东莞整站优化
  • 网站在公司做有什么要求吗上海seo优化服务公司
  • 图片类网站 怎么做优化青岛seo精灵
  • 中山外贸网站建设谷歌搜索引擎镜像
  • 如何做网站内容百度热线客服24小时
  • 有专门做摄影画册的网站吗百度搜索高级搜索
  • 自己做的网站别人打不开百度号码认证
  • 门户网站建设招标文件微信营销软件哪个好用
  • 曹县有没有做网站深圳最新消息今天
  • 颍上建设局网站google网站登录入口
  • 装饰公司怎么做微网站广告主广告商对接平台
  • 领动做的网站怎么样2021年度关键词有哪些
  • 网站的特征包括哪些方面哪个平台可以免费发广告
  • 域名和网站一样吗济南网站建设公司
  • 建立网站流程图网站seo快速
  • 重庆官方网站建设seo资源网站排名