求一组小一点的hack数据
  • 板块P6326 Shopping
  • 楼主yangjunhan1
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/19 22:19
  • 上次更新2024/12/20 15:55:37
查看原帖
求一组小一点的hack数据
856459
yangjunhan1楼主2024/12/19 22:19
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+10,M=4e3+10;
int n,m,c[N],w[N],d[N],s[N][M],k[N],dp[N][M],head[N],tot,T,ans;
struct qp{
    int to,ne;
}e[N<<1];
void add(int u,int v){
    e[++tot]={v,head[u]};
    head[u]=tot;
}
void init(){
    memset(k,0,sizeof k);
    memset(dp,0,sizeof dp);
    memset(head,0,sizeof head);
    tot=ans=0;
}
void dfs(int u,int fa){
    for(int i=1;i<=d[u] && i*c[i]<=m;i++){
        dp[u][i*c[u]]=w[u]*i;
        ans=max(ans,dp[u][i*c[u]]);
        s[u][++k[u]]=i*c[i];
    }
    for(int i=head[u];i;i=e[i].ne){
        int v=e[i].to;
        if(v==fa)   continue;
        dfs(v,u);
        int nk=k[u];
        for(int j=k[u];j;j--)
            for(int q=1;q<=k[v] && s[u][j]+s[v][q]<=m;q++){
                if(!dp[u][s[u][j]+s[v][q]]) s[u][++nk]=s[u][j]+s[v][q];
                dp[u][s[u][j]+s[v][q]]=max(dp[u][s[u][j]+s[v][q]],dp[u][s[u][j]]+dp[v][s[v][q]]);
                ans=max(ans,dp[u][s[u][j]+s[v][q]]);
            }
        k[u]=nk;
        sort(s[u]+1,s[u]+1+k[u]);
    }
}
int main(){
    //freopen("P6326_2.in","r",stdin);
    cin>>T;
    while(T--){
        init();
        cin>>n>>m;
        for(int i=1;i<=n;i++)   cin>>w[i];
        for(int i=1;i<=n;i++)   cin>>c[i];
        for(int i=1;i<=n;i++)   cin>>d[i];
        for(int i=1;i<n;i++){
            int u,v;
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        dfs(1,0);
        cout<<ans<<endl;
    }
    return 0;
}


//   g++ p6326.cpp -O2 -std=c++14 -Wall -o p6326
2024/12/19 22:19
加载中...