首页 > 其他分享 >其他背包问题简单总结

其他背包问题简单总结

时间:2024-01-21 14:44:23浏览次数:28  
标签:总结 背包 int max 枚举 简单 物品 dp

其他背包问题简单总结

1.完全背包

0/1背包问题:

已知有第 \(i\) 个物品的重量 \(w_{i}\),价值 \(v_{i}\),以及背包的总容量 \(W\)。

设 DP 状态 \(f_{i,j}\) 为在只能放前 \(i\) 个物品的情况下,容量为 \(j\) 的背包所能达到的最大总价值。

而完全背包,即是在\(0/1\)背包问题中,将一个物品只可以选取\(1\)次改为无限次。

从\(0/1\)背包的学习中,可以知道他的状态转移方程为:

\[f_j=\max \left(f_j,f_{j-w_i}+v_i\right) \]

它的枚举顺序是从右向左枚举,因为如果从左到右枚举,\(f_j\) 会被 \(f_{j-w_i}\) 影响,会出现一个物品重复拿多次的情况,而完全背包正好可以重复选取,所以完全背包的状态转移方程和\(0/1\)背包的状态转移方程相同,但是枚举顺序变成了从左向右,代码如下:

for (int i = 1; i <= m; i++)
		for (int j = w[i]; j <= W; j++) {
			dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
		}
	cout << dp[W];

2.多重背包

问题:

多重背包,即是在\(0/1\)背包的基础上,将一个物品只可以选取\(1\)次改为 \(s_i\) 次

考虑将多重背包转换为\(0/1\)背包问题,可以将一个物品选取 \(s_i\) 次转换为有 $ s_i$ 个相同的物品,每个物品选一次

代码如下:

for (int i = 1; i <= n; i++)
		for (int k = 1; k <= s[i]; k++)
			for (int j = m; j >= v[i]; j--)
				dp[j] = max(dp[j], dp[j - v[i]] + w[i]);

二进制分组优化:

\(0\) ~ \(s_i\) 的枚举时间复杂度实在是太高了,我们可以考虑将物品数量分组。

考虑将 \(s_i\) 分成 \(2^{j}\) 组,如果最后一个分解不彻底,需要添加上剩下的。

比如:

\(5 = 1 + 2 + 3\)

\(11 = 1 + 2 + 4 + 4\)

\(16 = 1 + 2 + 4 + 8 + 1\)

\(63 = 1 + 2 + 4 + 8 + 16 + 32\)

具体代码实现:

for (int i = 1; i <= n; i++) {
		cin >> a >> b >> num;
		for (int j = 1; j <= num; j *= 2) {
			num -= j;
			w[++cnt] = a * j;
			c[cnt] = b * j;
		}
		if (num) {
			w[++cnt] = a * num;
			c[cnt] = b * num;
		}
	} //二进制分组优化
	for (int i = 1; i <= cnt; i++)
		for (int j = m; j >= w[i]; j--)
			dp[j] = max(dp[j], dp[j - w[i]] + c[i]); //0/1背包直接求解即可

3.混合背包

就是把前面学过的各种背包组合一下,可能有的取\(1\)次,有的无限次, 有的 \(s_i\) 次,需要判断是哪个背包,代码略。

参考资料

背包 DP - OI Wiki

标签:总结,背包,int,max,枚举,简单,物品,dp
From: https://www.cnblogs.com/X1aonuo/p/17977846

相关文章

  • [低代码平台] 自我总结:帆软▪简道云VS金蝶▪云之家
    云平台▪架构概述云平台架构基本包括以下几个关键组件:前端用户界面:提供一个可视化的、拖拽式的界面,让用户无需编码即可设计应用程序。后端服务:执行业务逻辑、数据处理和集成服务。数据存储和管理:用于存储用户数据和应用数据的数据库系统。API和集成层:使平台能够与外部系统和数......
  • 0-1背包和完全背包,初级理解和总结
    0-1背包就是数组中元素只能取一个,完全背包就是数组中的元素能无限取。最开始接触的就是纯粹的背包问题,就是怎么装是背包价值最大,二维数组,if(j<weight[i])dp[i][j]=dp[i-1][j];elsedp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);一维数组,dp[j......
  • Canal使用和安装总结
    转载请注明出处:1.定义Canal组件是一个基于MySQL数据库增量日志解析,提供增量数据订阅和消费,支持将增量数据投递到下游消费者(如Kafka、RocketMQ等)或者存储(如Elasticsearch、HBase等)的组件。 Canal感知到MySQL数据变动,然后解析变动数据,将变动数据发送到MQ或者同......
  • 前端学习-简单项目练习01-小兔鲜
    一些笔记使用flex-wrap换行(一行一个元素)ul{display:flex;flex-wrap:wrap;}ulli{flex:100%;}html中让img撑满整个divdiv要设置宽高,img也要有宽高且均为100%,最重要的是img要给display:block。<divid="mainDiv"style="width:100%;height:100%">......
  • 认识存储网络:手动搭建 IPFS 环境以及简单应用的开发
    认识存储网络:手动搭建IPFS环境以及简单应用的开发一、实验背景IPFS是一个点对点的分布式文件系统,将所有的计算设备与相同的文件系统连接起来。在某些方面,IPFS类似于Web,但IPFS可以被视为一个单一的比特流群,在Git存储库中交换对象。换句话说,IPFS提供了一个具有内容寻址的超链接......
  • Spring Boot 中使用Caffeine缓存的简单例子
    Caffeine缓存是Java的高性能缓存库。本文简单记录下Caffeine缓存的用法。依赖配置<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency&g......
  • 简单Dapp的开发
    简单Dapp的开发实验概述DApp(DecentralizedApplication)去中心化应用,自P2P网络出现以来就已经存在,是一种运行在计算机P2P网络而不是单个计算机上的应用程序。DApp以一种不受任何单个实体控制的方式存在于互联网中。在区块链技术产生之前,BitTorrent,PopcornTime,BitMessage等......
  • 今日总结
    点击【左上角】的【File】,选择【Settings...】 选择【Plugins】在输入框中输入【Scala】等待几秒后,看到显示【Scala】点击【Install】当显示为【Installed】代表安装成功了。 步骤二、maven引包打开【pom.xml】 初始状态: 输入以下编码内容:<!--基础配置--><......
  • 2020年终总结(技术篇),重整心情、扬帆起航
    大二上篇突如其来的疫情打破了以往的平静,哪都不能去只能呆在家里,因此我收获了有史以来最长的一个寒假,在宅在家的这4个月里面,我独立做了一个大项目嘿嘿,还有一个烂大街的后台管理系统,虽然很普通但是确实我一个个敲出来的东西,很有成就感,期间历时一个多月,每天除了和家人的交际,那段时间......
  • springboot项目结合filter,jdk代理实现敏感词过滤(简单版)
    我们对getParameter()这个方法得到的参数进行敏感词过滤。实现思路:利用过滤器拦截所有的路径请求同时在在过滤器执行的时候对getParameter得到的value值进行过滤。最后呢,到我们自己的实现的逻辑中呢?这个value值就被我们做过处理了。1:自定义的过滤配置文件把文件位置放在resource下的......