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? ...
随机推荐
- class——python编程从入门到实践
创建和使用类 1. 创建Dog类 class Dog: """一次模拟小狗的简单尝试""" def __init__(self, name, ...
- (转)三大WEB服务器对比分析(apache ,lighttpd,nginx)
ref : https://www.iteye.com/blog/hai0378-1860220 一.软件介绍(apache lighttpd nginx) 1. lighttpd Light ...
- Spark 系列(十三)—— Spark Streaming 与流处理
一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop 采用 HDFS 进 ...
- c# 基于RTMP推流 PC+移动端 拉流播放
网上关于直播相关的文章很多,但是讲解还是不够系统,对于刚刚接触直播开发的朋友实施起来会浪费不少时间.下面结合我自己的经验, 介绍一下直播方面的实战经验. 分成两个部分 第一部分是标题中介绍的基于RTM ...
- git push proxy 取消不掉 can not prox....
使用这个折腾了半天 git config --global --unset http.proxy git config --global --unset https.proxy 没用,原来实现项目目录 ...
- 使用 Code First 数据库迁移
当 Entity Framework Code First 的数据模型发生改变时,默认会引发一个System.InvalidOperationException 的异常.解决方法是使用DropCrea ...
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
- python使用tkinter无法给顶层窗体的输入框设定默认值
这几天某同学遇到了一个棘手的问题,困扰了很久.今天终于解决了,我来记录一下坑. 情景:python 使用tkinter为第二层窗体(顶层窗体)中的一个输入框设定默认值时,总是无法设置,而且对输入框获取 ...
- python智能提取省、市、区地址
工具原文 https://github.com/DQinYuan/chinese_province_city_area_mapper 说明: https://blog.csdn.net/qq_3325 ...
- MySQL Error--存储inode用完后报设备没有空间
问题描述:磁盘有足够剩余空间,但在创建文件或文件夹时报错,提示“设备没有空间”. 问题原因:当存储设备通过分区格式化为文件系统后,会分为两部分:1.block部分: 存储的最小单位为扇区(Sector ...