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

多重背包问题 一句话说清楚“二进制拆分“

目录

区别:

一句话说清楚:

板子:


区别:

得先懂完全背包问题完全背包问题 非零基础-CSDN博客

都是让背包内价值最大。

完全背包问题每种物品可以取无数次。而多重背包问题每件取的次数有限。

都可以用的最挫的方法就是0~k件去遍历。

完全背包问题可以推出公式优化(或者说逻辑上可以直接一次从前往后遍历)

多重背包问题不好推公式。本文讲的是二进制拆分方法来优化(完全背包问题也可以用这个,但是不是最优)

可以参考大佬文章学习 背包九讲——全篇详细理解与代码实现-CSDN博客

练习题: P1776 宝物筛选 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一句话说清楚:

一句话说清这个二进制拆分:

int 整形知道吧?只需要32位就可以表示 -2147483647 - 1 ~ 2147483647

有点感觉吗?

再细说:1可以表示1 , 2可以表示2 , 1和2一起可以表示3 ,但我们只需要用到两个数,不需要遍历1到3

板子:

目的:把num拆成二进制  (最后一位(即剩余)未必是2的倍数)

第 i 件物品 ,本次装 k 件 ,j 是当前背包大小

W 是背包大小

m[ i ]是该物品的数目,w[ i ]是该物品的大小 , v[ i ]是该物品的价值

num是最大数目 : 看能装多少 W / w[i] ,再看有多少m[ i ] 。数目够,就尽可能装。数目w[i]不够,那就全装进去。

	vector<ll>dp(MAX);for (int i = 1; i <= n; i++){int num = min(m[i], W / w[i]);for (int k = 1; num > 0; k<<=1){if (k > num)k = num;num -= k;for (int j = W; j >= 0; j--){if (j - w[i] * k >= 0)dp[j] = max(dp[j], dp[j - w[i] * k] + v[i] * k);}}			}

if可以自行优化掉

ε≡٩(๑>₃<)۶ 一心向学,加油!

http://www.lryc.cn/news/253483.html

相关文章:

  • nodejs微信小程序+python+PHP本科生优秀作业交流网站的设计与实现-计算机毕业设计推荐
  • 使用git出现的问题
  • rk3568 适配PCIE(二)
  • Java基础 进制
  • springboot中@Builder注解的详细用法实例,跟数据库结合。
  • WT2605C蓝牙音频语音芯片:具备大功率IO驱动能力,引领音频技术新纪元
  • 【Java 基础】20 多线程操作方法
  • SpringBoot使用mybatis-plus分页查询无效解决方案
  • QT 中 线程池 (备查)
  • LeetCode刷题笔记第71题:简化路径
  • JavaScript <md5加密的两种不同输出结果分析>--案例(二点一)
  • 『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器配置Nginx静态网页
  • 28、卷积 - 卷积的基础公式
  • Mac电脑vm虚拟机 VMware Fusion Pro中文 for mac
  • 区块链技术的应用场景和优势
  • java面试题-谈谈sql优化-mysql
  • 【Linux服务器Java环境搭建】07 在linux中安装MySql,以及对MySQL的配置与远程连接
  • 用 LangChain 搭建基于 Notion 文档的 RAG 应用
  • QT中如何使用自定义控件
  • xcode ——Instrumets(网络连接调试)使用
  • Ps:文字操作常用快捷键
  • SpringSecurity的默认登录页的使用
  • 【Rust日报】2023-12-04 slint 成功案例
  • 嵌入式硬件和软件哪个好?
  • MySQL 8.x 自签证书通过keytool和openssl转成JKS文件
  • MybatisPlus概述
  • C++之枚举与宏定义
  • DAPP开发【09】NFT交易市场开发(hardhat测试)
  • 【Spring Boot】如何通过RestTemplate获取另一个服务的接口返回信息
  • 文字识别(OCR)专题——基于NCNN轻量级PaddleOCRv4模型C++推理