code:
#include<bits/stdc++.h>
using namespace std;
long long n,m,V,cnt,l,r,ans,a,b,c,w[100001],v[100001],id[100001],dp1[100001][1001],dp2[100001][1001],num;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
int x=1;
while(x<=c){
w[++cnt]=a*x,v[cnt]=b*x,id[cnt]=i;
c-=x,x*=2;
}
if(c){
w[++cnt]=a*c,v[cnt]=b*c,id[cnt]=i;
}
}
n=cnt;
for(int i=1;i<=n;i++){
for(int j=1;j<=1000;j++) dp1[i][j]=dp1[i-1][j];
for(int j=1000;j>=w[i];j--){
dp1[i][j]=max(dp1[i][j],dp1[i-1][j-w[i]]+v[i]);
}
}
for(int i=n;i>=1;i--){
for(int j=1;j<=1000;j++) dp2[i][j]=dp2[i+1][j];
for(int j=1000;j>=w[i];j--){
dp2[i][j]=max(dp2[i][j],dp2[i+1][j-w[i]]+v[i]);
}
}
cin>>m;
while(m--){
ans=l=r=0;
cin>>num>>V;
while(id[l+1]<num&&l<n) l++;
r=l;
while(id[r+1]<=num&&r<n) r++;
for(int j=0;j<=V;j++){
ans=max(ans,dp1[l][j]+dp2[r+1][V-j]);
}
cout<<ans<<endl;
}
return 0;
}
样例没过,0pts