1 条题解

  • 0
    @ 2026-7-4 12:12:03

    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int M = 55;
    #define int long long
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,k,d,mx,a[M],dp[M*M*M];vector<int> g[M];
    struct node{int w,v;}s[M];
    void dfs(int u)
    {
    	for(int v:g[u])
    	{
    		dfs(v);
    		s[u].w+=s[v].w;
    		s[u].v+=s[v].v;
    	}
    }
    signed main()
    {
    	n=read();m=read();d=read();
    	for(int i=1;i<=n;i++)
    	{
    		s[i].v=read();s[i].w=1;
    		if(i>1) g[read()].push_back(i);
    	}
    	dfs(1);mx=n*n*n;k=min(n,d);
    	memset(dp,0x3f,sizeof dp);dp[0]=0;
    	for(int i=1;i<=n;i++)
    	{
    		int x=k;
    		for(int j=0;(1<<j)<=x;j++)
    		{
    			int w=s[i].w*(1<<j),v=s[i].v*(1<<j);
    			for(int l=mx;l>=w;l--)
    				dp[l]=min(dp[l],dp[l-w]+v);
    			x-=(1<<j);
    		}
    		if(x)
    		{
    			int w=s[i].w*x,v=s[i].v*x;
    			for(int l=mx;l>=w;l--)
    				dp[l]=min(dp[l],dp[l-w]+v);
    		}
    	}
    	sort(s+1,s+1+n,[&](node x,node y)
    	{return x.w*y.v>x.v*y.w;});
    	int r=n,ans=0;while(s[r].w!=n) r--;
    	for(int i=0;i<=mx;i++)
    	{
    		if(dp[i]>m) continue;
    		int w=i,v=dp[i];
    		for(int j=1;j<r;j++)
    		{
    			int c=min(d-k,(m-v)/s[j].v);
    			w+=c*s[j].w;v+=c*s[j].v;
    		}
    		int c=(m-v)/s[r].v;
    		w+=c*s[r].w;v+=c*s[r].v;
    		ans=max(ans,w);
    	}
    	printf("%lld\n",ans);
    }
    
    
    • 1

    信息

    ID
    9380
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者