动态规划(算法竞赛、蓝桥杯)--背包DP多重背包单调队列优化

1、B站:E13 背包DP 多重背包 单调队列优化_哔哩哔哩_bilibili

题目链接:宝物筛选 - 洛谷

9d736b24ae084fc3885ed150a092deda.png

4f8e419dfafe49d79cbf67180280a095.png

3a88d1a22ade48b2812c048175411f00.png

54da43d7dfb7453c838bb7ffac7bda75.png

3bbdfc54a30641b4b60b46116bba37c5.png

c92b45d8aa424bdb9a3ad1bd8d599290.png

2a67ae1106904695b3a18351a5edd2ab.png

cb98c3979b4d48bb8942331788d53d85.png

#include <bits/stdc++.h> 
using namespace std;
const int N=4000005;
int n,m,w,v,s;
int f[N],g[N],q[N];

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		memcpy(g,f,sizeof(f));
		cin>>v>>w>>s;
		for(int j=0;j<v;j++){
			int h=1,t=0;
			for(int k=j;k<=m;k+=v){
				while(h<=t&&g[k]>=g[q[t]]+(k-q[t])/v*w)t--;//当前元素更优,队尾出队 
				q[++t]=k;//队尾入队(下标) 
				if(q[h]<k-s*v)h++;//队头出队 
				if(h<=t)f[k]=max(g[k],(g[q[h]])+(k-q[h])/v*w);//输出最大值	
			}
		}
	}
	cout<<f[m];
	
	return 0;
}

题目链接:宝物筛选 - 洛谷 

#include <bits/stdc++.h> 
using namespace std;
const int N=40005;
int n,W,w,v,m;
int f[N],g[N];
int q[N];

int main(){
	scanf("%d%d",&n,&W);//宝物总数与最大载重
	for(int i=1;i<=n;i++){//枚举宝物 
		memcpy(g,f,sizeof(f));//f备份到g
		scanf("%d%d%d",&v,&w,&m);
		for(int j=0;j<w;j++){//分成w个类 
			int h=1,t=0;
			for(int k=j;k<=W;k+=w){
				while(h<=t&&g[k]>=g[q[t]]+(k-q[t])/w*v)t--;
				q[++t]=k;
				if(q[h]<k-m*w)h++;
				if(h<=t)f[k]=max(g[k],g[q[h]]+(k-q[h])/w*v);
			}
		} 
	} 
	printf("%d\n",f[W]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值