记录编号 228772 评测结果 AAAAAAAAAA
题目名称 [CTSC 1997]选课 最终得分 100
用户昵称 GravatarMagic_Sheep 是否通过 通过
代码语言 C++ 运行时间 0.567 s
提交时间 2016-02-19 17:03:42 内存使用 0.79 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=500+10;
int n,m;
int brother[maxn],child[maxn],score[maxn];
int opt[maxn][maxn];
bool res[maxn];
void read()
{
    score[0]=0;
    scanf("%d%d",&n,&m);
    score[n+1]=0;
    memset(child,-1,sizeof(child));
    memset(brother,-1,sizeof(brother));
    for(int i=1;i<=n;++i)
    {
        int tmp;
        scanf("%d%d",&tmp,score+i);
        brother[i]=child[tmp];
        child[tmp]=i;
    }
}

int solve(int root,int k)
{
    if(root<0 || k<=0)return 0;
    if(opt[root][k]>=0)return opt[root][k];
    opt[root][k]=solve(brother[root],k);
    for(int i=0;i<k;++i)
    {
        if(opt[root][k]<solve(brother[root],i)+solve(child[root],k-i-1)+score[root])
            opt[root][k]=solve(brother[root],i)+solve(child[root],k-i-1)+score[root];
    }
    return opt[root][k];
}
void path(int r,int k)
{
    int b=brother[r],c=child[r];
    if(b>0 && opt[b][k]==opt[r][k])
    {
        res[r]=0;
        path(b,k);
    }
    else
    {
        for(int i=0;i<k;++i)
            if(opt[r][k]==solve(brother[r],i)+solve(child[r],k-i-1)+score[r])
            {
                res[r]=1;
                path(b,i);
                path(c,k-i-1);
                return;
            }
    }
}
void print()
{
    printf("%d\n",opt[0][m+1]);
    path(0,m+1);
    for(int i=1;i<=n;++i)if(res[i])printf("%d\n",i);
}
int main()
{
    freopen("course.in","r",stdin);
    freopen("course.out","w",stdout);
    read();
    memset(opt,-1,sizeof(opt));
    memset(res,0,sizeof(res));
    solve(0,m+1);
    print();
    return 0;
}