dp--01背包,完全背包,多重背包
背包问题
01背包
\(n\)个物品,每个物品都有一个价值和体积,有一个容量为\(V\)的背包,最大可以得到的价值是多少
每个物品都有两种可能,选与不选
code
for(int i = 0; i < n; i++)
{
for(int j = m; j >= w[i]; j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
背包恰好装满
定义\(dp[i]\)表示\(i\)状态可达,初始化\(dp\)为\(0\),代表不可达,\(dp[0] = 1\),代表可达
状态转移方程\(dp[i] = max(dp[i],dp[i-a[i]])\)
code
for(int i = 1; i <= n; i++)
{
for(int j = V; j >= a[i]; j++)
{
dp[j] = max(dp[j],dp[j-a[i]]);
}
}
完全背包
每个物品可以取任意次,而不是一次,所以我们就不用担心\(01\)背包的状态覆盖问题
直接从\(a[i]\)遍历到\(V\)
code
for(int i=1; i<=n; i++)
{
for(int j=w[i]; j<=m; j++) //和01背包的唯一区别
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
多重背包转01背包
多重背包例题
每个物品可以取\(c\)次
二进制优化
我们把\(c\)次划分成\(1,2,4,8...\)之类的数,然后进行\(01\)背包就行了
一定存在某个最优的次数,而划分成二进制一定可以表示成那个数
code
for(int i = 0,a,b,c; i < n; i++)
{
scanf("%d%d%d",&a,&b,&c); //价值,重量,数量
int k = 1;
while(c-k > 0)
{
v[t] = k*a;
w[t++] = k*b;
c -= k;
k *= 2;
}
v[t] = c*a; //把剩下的当成一个物品
w[t++] = c*b;
}
//01背包
for(int i = 0; i < t; i++) //t个物品
{
for(int j = m; j >= w[i]; j--)
{
dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}
}
单调队列优化
二维背包
增加一维就好了,dp[i][j][k] //第i个,花费j,时间k
也可以空间优化,优化掉第一维度
参考博客
https://www.cnblogs.com/-guz/p/9866118.html
dp--01背包,完全背包,多重背包的更多相关文章
- HDU 1114 完全背包 HDU 2191 多重背包
HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...
- Java实现 蓝桥杯 算法提高VIP 摆花 dp 记忆搜索 2种做法 多重背包
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- 01背包模板、全然背包 and 多重背包(模板)
转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...
- DZY Loves Math II:多重背包dp+组合数
Description Input 第一行,两个正整数 S 和 q,q 表示询问数量.接下来 q 行,每行一个正整数 n. Output 输出共 q 行,分别为每个询问的答案. Sample Inpu ...
- POJ1276 - Cash Machine(多重背包)
题目大意 给定一个容量为M的背包以及n种物品,每种物品有一个体积和数量,要求你用这些物品尽量的装满背包 题解 就是多重背包~~~~用二进制优化了一下,就是把每种物品的数量cnt拆成由几个数组成,1,2 ...
- POJ 1742 Coins(多重背包, 单调队列)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)
HDU 2191悼念512汶川大地震遇难同胞--珍惜如今.感恩生活(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意: 如果你有资金n元, ...
- POJ 2392 Space Elevator(贪心+多重背包)
POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...
- HDU 3732 Ahui Writes Word(多重背包)
HDU 3732 Ahui Writes Word(多重背包) http://acm.hdu.edu.cn/showproblem.php? pid=3732 题意: 初始有N个物品, 每一个物品有c ...
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
随机推荐
- Python使用RMF聚类分析客户价值
投资机构或电商企业等积累的客户交易数据繁杂.需要根据用户的以往消费记录分析出不同用户群体的特征与价值,再针对不同群体提供不同的营销策略. 用户分析指标 根据美国数据库营销研究所Arthur Hughe ...
- Linux的软连接、硬链接和find命令
软链接和硬链接 序号 命令 作用 01 ln –s 被链接的源文件 链接文件 建立文件的软连接,用通俗的是方式类似于Windows下的快捷链接 源文件连接要是有绝对路径,不能使用相对路径,这样可以方便 ...
- logrus 剖析之 formatter
使用 logrus 通过 formatter 来定义输出日志的格式,具体例子如下: package main import ( log "github.com/Sirupsen/logrus ...
- exit status 1
- 解决unzip解压中文乱码问题
使用 unzip XXX.zip 方式解压的时候会出现中文乱码 很多人推荐以下方式: 在windows执行命令,可显示字符集数字一般为936: # chcp // 解压时加上-O cp936,xxx为 ...
- jvm堆内存模型原理分析及堆内存分析工具jhat和MAT的使用超详细教程
- chmod: changing permissions of 'xxx': Operation not permitted
众所周知,在linux系统中,权限最大的是root账号,但凡修改涉及到系统本身的重大权限的操作,都需要root的权限才能操作.但是有些时候也有root干不了的事情. 比如:chmod: changin ...
- Dubbo学习摘录(一)
Dubbo基于自定义配置,实现自己的Bean. 通常,完成一个自定义配置需要以下步骤: 设计配置属性和JavaBean: 编写XSD文件: 编写NamespaceHandler和BeanDefinit ...
- 玩转Spring全家桶笔记 02 那些好用的连接池HikariCP
1.前言 简单了解一下来自日本的一个新起之秀连接池---HikariCP github:https://github.com/brettwooldridge/HikariCP 2.HikariCP为什 ...
- .net 调用存储过程
语言:C# 一.调用带输入参数的存储过程 首先自然是在查询分析器里创建一个存储过程喽~~ 如下所示: create proc proc_1 @uid int, @pwd varchar(255) ...