关于单调队列优化多重背包的疑问
  • 板块P1776 宝物筛选
  • 楼主yysyys
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/18 20:03
  • 上次更新2024/11/18 21:01:29
查看原帖
关于单调队列优化多重背包的疑问
1009887
yysyys楼主2024/11/18 20:03
#include<bits/stdc++.h>
using namespace std;
int n,W,w[40010],m[40010],v[40010],ans,anss,q[40010],num[40010],dp[40010];
signed main() {
	cin>>n>>W;
	for(int i=1;i<=n;i++) 
	    scanf("%d%d%d",&v[i],&w[i],&m[i]);
	for(int i=1;i<=n;i++) {
		if(w[i]==0) {
			anss+=v[i]*m[i];
			continue ;
		}
		int cu=min(m[i],W/w[i]);//每件物品最多能拿多少 
		for(int d=0;d<w[i];d++) {//模数为多少 
			int h=1,t=0;
			for(int k=0;k<=(W-d)/w[i];k++) {
				int nw=dp[d+k*w[i]]-v[i]*k;
				while(h<t&&num[h]+cu<k) h++; 
				dp[d+k*w[i]]=max(dp[d+k*w[i]],q[h]+k*v[i]); 
				ans=max(ans,dp[d+k*w[i]]);
				while(h<=t&&q[t]<=nw) t--;//维持单调性 
				q[++t]=nw,num[t]=k;
			}
			for(int k=1;k<=t;k++) q[k]=0;
		}
	}
	cout<<anss+ans;
	return 0;
}

蒟蒻不是很清楚

while(h<t&&num[h]+cu<k) h++; 

请问大佬们这里 d+k×wid+k\times w_i 是否会因为 numhnum_h 中已经选了一些数而超出数量限制

2024/11/18 20:03
加载中...