首页 > 其他分享 >多重背包单调队列

多重背包单调队列

时间:2023-04-16 15:59:23浏览次数:40  
标签:多重 背包 队列 完全 int 单调

考虑思考完全背包问题的过程。完全背包其实是一个前缀最值的过程。而完全背包就是滑动窗口问题。可以把余数相同的归为一类,然后就可以直接单调队列了,队长 \(s\)。

#include<cstdio>
#define max(x,y) ((x)>(y)?(x):(y))
const int N=20001;
int n,m,f[N],g[N],q[N]; 
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i){
		int v,w,s;
		scanf("%d%d%d",&v,&w,&s);
		for(int j=0;j<=m;++j)g[j]=f[j];
		for(int j=0;j<v;++j){//注意这个两重循环是 O(m),因为每个余数都枚举到了,只是整合成一块了。
			int hh=0,tt=-1;
			for(int k=j;k<=m;k+=v){//单调队列优化
				if(hh<=tt&&q[hh]<k-s*v)++hh;
				if(hh<=tt)f[k]=max(f[k],g[q[hh]]+(k-q[hh])/v*w);
				while(hh<=tt&&g[q[tt]]-(q[tt]-j)/v*w<=g[k]-(k-j)/v*w)--tt; 
				q[++tt]=k;
			}
		}
	}
	printf("%d",f[m]);
	return 0;
}

标签:多重,背包,队列,完全,int,单调
From: https://www.cnblogs.com/wscqwq/p/17323384.html

相关文章

  • 栈和队列经典题题解
    目录......
  • JUC之阻塞队列BlockingQueue的实现原理
    1.阻塞队列首先它是一个队列,是队列就会遵循先进先出(FIFO)的原则,又因为它是阻塞的,故与普通的队列有两点区别:A.当一个线程向队列里面添加数据时,如果队列是满的,那么将阻塞该线程,暂停添加数据。B.当一个线程从队列里面取出数据时,如果队列是空的,那么将阻塞该线程,暂停取出数据。2......
  • 栈和队列的基本操作
     目录一.栈和队列的概念......
  • 背包DP
    背包DP二进制分组优化考虑优化。我们仍考虑把多重背包转化成0-1背包模型来求解。预处理物品数量是2的次方。且要覆盖物品数量的点。即2n次方+1到kindex=0;for(inti=1;i<=m;i++){intc=1,p,h,k;cin>>p>>h>>k;while(k>c){k-=c;......
  • 华电软工非全研究生室内定位研究-室内定位物联网平台中的时序数据库和mq队列他们的作
    时序数据库(TimeSeriesDatabase,TSDB)是一种专门用于存储和处理时间序列数据的数据库系统。在室内定位物联网平台中,时序数据库通常用于存储传感器采集的数据,如定位节点的位置、传感器数据等。时序数据库具有以下优点:优点:快速插入和查询时序数据,适用于海量数据存储和实时数据分析;......
  • python3多线程-线程池和优先队列
    1、介绍有两种线程池方案。各线程持续存在,从任务池获取任务进行执行按照需求创建线程,每个线程只执行一个任务,结束完毕则该线程结束2、准备(1)任务池task_list任务池是用于准备各任务单元的环境,比如http爆破时的请求参数,读写文件时的路径。任务池的准备可能会占用一定时间,边准......
  • 23-4-14--链表--银行排队问题之单队列多窗口服务
    假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统......
  • 设计循环队列
    设计循环队列题目链接思路这道题如果用循环链表会有很多问题,如图下 下面首先说一下用数组实现循环队列的结构 然后用这个结构实现入队,出队,判空,判满操作操作,如图下  下面代码实现typedefstruct{int*dys;intfront;intrear;......
  • 剑指 Offer 09. 用两个栈实现队列 && leetcode225.用队列实现栈
     剑指Offer09.用两个栈实现队列 classCQueue{private:stack<int>inStack,outStack;voidin2out(){//这里必须是while循环,如果是if判断,则输出栈日常只有一个值,没有起到先入后出的作用while(!inStack.empty()){//将输入栈栈顶......
  • 背包问题
    01背包问题题目有一个背包的容积为\(m\),有\(n\)个物品,每个物品的体积为\(w\),权重为\(v\),每个物品只能取\(1\)次放入背包中,背包所有物品权重和最大是多少?求值创建一个状态矩阵\(dp\),横坐标\(i\)表示物品编号,纵坐标\(j\)表示背包容量。\(dp[i][j]\)表示在已用背包容量为\(j\)的......