选课 树形dp+路径输出

时间:2024-12-23 15:34:32
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 2010
using namespace std;
int n,m,v[maxn],sum[maxn],son[maxn][maxn],s[maxn][],f[maxn][maxn];
bool falg[maxn];
int Dfs(int k,int p)
{
if(k==&&p!=m||p==)return ;
if(f[k][p])return f[k][p];
int s1=,s2=,lc=son[k][],rc=son[k][];
if(rc)s1=Dfs(rc,p);
for(int i=;i<=p-;i++)
s2=max(s2,Dfs(lc,i)+Dfs(rc,p-i-)+v[k]);
return f[k][p]=max(s1,s2);
}
void Path(int k,int p)
{
int lc=son[k][],rc=son[k][];
if(rc&&f[rc][p]==f[k][p])
{
falg[k]=;Path(rc,p);return;
}
for(int i=;i<=p-;i++)
{
if(f[k][p]==f[lc][i]+f[rc][p-i-]+v[k])
{
falg[k]=;Path(lc,i);
Path(rc,p-i-);return;
}
}
}
int main()
{
freopen("course.in","r",stdin);
freopen("course.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y;m++;
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);v[i]=y;
if(son[x][]==)son[x][]=i;
else
{
int now=son[x][];
while(son[now][])now=son[now][];
son[now][]=i;
}
}
int ans=Dfs(,m);
printf("%d\n",ans);
Path(,m);
for(int i=;i<=n;i++)
if(falg[i])
printf("%d\n",i);
return ;
}