萌新刚学oi,50pts求助
查看原帖
萌新刚学oi,50pts求助
399116
LYqwq楼主2022/9/25 09:59
#include <iostream>
#include <cstring>
using namespace std;
template<typename T=int>
inline T read(){
    T X=0; bool flag=1; char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+(ch^48),ch=getchar();
    if(flag) return X;
    return ~(X-1);
}

template<typename T=int>
inline void write(T X){
    if(X<0) putchar('-'),X=~(X-1);
    T s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    putchar('\n');
}

const int N=5e2+5,inf=0x3f3f3f3f;
int n,q,cst,few;
int co[N],fe[N],w[N];
int f[N][N]; // f[j][k]: 总价j,新鲜程度k,最大美丽度
int ans[N][N]; // ans[j][k]: 总价小于等于j,新鲜程度大于等于k 的最大美丽度

int main(){
    memset(f,-inf,sizeof(f));
    n=read(),q=read();
    for(int i=1; i<=n; i++)
        co[i]=read(),fe[i]=read(),w[i]=read();
    f[0][0]=0;
    for(int i=1; i<=n; i++)
        for(int j=500; j>=co[i]; j--)
            for(int k=500; k>=fe[i]; k--)
                f[j][k]=max(f[j][k],f[j-co[i]][k-fe[i]]+w[i]);
    for(int i=0; i<=500; i++) // 状态变化:由 恰好最大值 变为 i小于等于,j大于等于的最大值
        for(int j=500; j>=0; j--)
            ans[i][j]=max(f[i][j],max(i ? ans[i-1][j] : -inf,ans[i][j+1]));
    while(q--){
        cst=read(),few=read();
        write(ans[cst][few]);
    }
    return 0;
}

awa

2022/9/25 09:59
加载中...