1 条题解
-
0

#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
- 上传者