[Acwing] 6. 多重背包问题 III 单调队列优化

前言

传送门 :

思路

传统的多重背包 O n 3 O n^3 On3
二进制优化 O n 2 l o g n O n^2logn On2logn
使用单调队列优化 O N V O NV ONV

算法只不过是工具,一切围绕目的不放开

Mycode

const int N  = 1010, M = 20010;
int n,m;
int v[N],w[N],s[N];
int f[N],g[M];
int q[M];

void solve(){
	cin>>n>>m;
	//体积 价值 数量	
	for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i];
	
	for(int i=1;i<=n;i++){
		
		memcpy(g,f,sizeof g);
		
		for(int r = 0 ; r<v[i]; ++ r){
		
			int  hh = 0 , tt=-1;
		
			for(int  j = r;j<=m;j+=v[i]){
		
				while(hh<=tt && j-q[hh] > s[i]*v[i]) hh++;
		
				while(hh<=tt && g[q[tt]] + (j-q[tt])/v[i]*w[i] <= g[j]) --tt;
		
				q[++tt] = j;
		
				f[j] = g[q[hh]] + (j - q[hh])/v[i]*w[i];
			}
		}
	}
	cout<<f[m]<<endl;
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值