这题要是自己想根本想不出来啊。。。。
没办法只能看qyf代码。。。。
不过早晨还是用20分钟理解了。。。
真的这种题做不了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#define pb push_back
#define read(x) scanf("%d",&x);
#define MAX 2100
using namespace std;
int can[MAX],power[MAX],n,m,ans=-0x7fffffff,value[MAX];
int f[100][200][MAX];
int father[MAX];
struct wbysr
{
int num,need;
};
vector<wbysr>child[MAX];
void dfs(int x)
{
if(child[x].size()==0)
{
can[x]=min(can[x],m/value[x]);
for(int i=0;i<=can[x];i++)
for(int j=i;j<=can[x];j++)
f[x][i][j*value[x]]=(j-i)*power[x];
return;
}
can[x]=0x7fffffff;
for(int i=0;i<child[x].size();i++)
{
int num=child[x][i].num,need=child[x][i].need;
dfs(num);
can[x]=min(can[x],can[num]/need);
}
for(int i=0;i<=can[x];i++)
f[x][i][0]=0;
for(int i=0;i<child[x].size();i++)
{
int now=child[x][i].num,need=child[x][i].need;
for(int j=0;j<=can[x];j++)
{
int g[MAX];
memcpy(g,f[x][j],sizeof(f[x][j]));
memset(f[x][j],-1,sizeof(f[x][j]));
for(int k=m;k>=0;k--)
{
for(int r=k;r>=0;r--)
if(g[k-r]!=-1&&f[now][j*need][r]!=-1)
f[x][j][k]=max(f[x][j][k],g[k-r]+f[now][j*need][r]);
ans=max(ans,f[x][j][k]);
}
}
}
for(int i=0;i<=can[x];i++)
for(int j=i;j<=can[x];j++)
for(int k=0;k<=m;k++)
if(f[x][j][k]!=-1)
f[x][i][k]=max(f[x][i][k],f[x][j][k]+(j-i)*power[x]),ans=max(ans,f[x][i][k]);
return;
}
int main()
{
read(n);
read(m);
memset(father,0,sizeof(father));
for(int i=1;i<=n;i++)
{
char ch;
read(power[i]);
scanf(" %c",&ch);
if(ch=='A')
{
int a1;
read(a1);
for(int j=1;j<=a1;j++)
{
int b1,b2;
read(b1);
read(b2);
child[i].pb((wbysr){b1,b2});
father[ b1]=i;
}
}
else
{
read(value[i]);
read(can[i]);
}
}
memset(f,-1,sizeof(f));
for(int i=1;i<=n;i++)
if(father[i]==0)
dfs(i);
printf("%d\n",ans);
return 0;
}