P4095 Eden 的新背包问题 RE求调
  • 板块学术版
  • 楼主uou203
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/14 10:47
  • 上次更新2025/1/14 16:24:57
查看原帖
P4095 Eden 的新背包问题 RE求调
1280919
uou203楼主2025/1/14 10:47
#include <bits/stdc++.h>
using namespace std;
const int N=1005,M=3e5+5;
int n,m,c,ji;
long long f1[N][N],f2[N][N];
struct Node{
	int id;
	long long s;
}w[M],v[M];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	for(int i=1;i<=n;i++){
		int cw,cv,c;
		cin >> cw >> cv >> c;
		
		int now=1;
		while(now<=c){
			ji++;
			w[ji].s=cw*now;
			v[ji].s=cv*now;
			w[ji].id=i;
			v[ji].id=i;
			c-=now;
			now*=2;
		}
		
		if(c){
			ji++;
			w[ji].s=cw*c;
			v[ji].s=cv*c;
			w[ji].id=i;
			v[ji].id=i;
		}
	}
	
	cin >> m;
	n=ji;
	
	for(int i=1;i<=n;i++){
		for(int j=0;j<=1000;j++) f1[i][j]=f1[i-1][j];
		for(int j=1000;j>=w[i].s;j--)
			f1[i][j]=max(f1[i][j],f1[i-1][j-w[i].s]+v[i].s);
	}
	for(int i=n;i>=1;i--){
		for(int j=0;j<=1000;j++) f2[i][j]=f2[i+1][j];
		for(int j=1000;j>=w[i].s;j--)
			f2[i][j]=max(f2[i][j],f2[i+1][j-w[i].s]+v[i].s);
	}

	for(int k=1;k<=m;k++){
		int cn,V;
		cin >> cn >> V;
		
		cn++;
		long long ans=0;
		int l=0,r=0;
		while(w[l+1].id<cn && l<n) l++;
		r=l;
		while(w[r+1].id<=cn && r<n) r++;
		
		for(int j=0;j<=V;j++) ans=max(ans,f1[l][j]+f2[r+1][V-j]);
		cout << ans << "\n";
	}
	return 0;
}
2025/1/14 10:47
加载中...