记录编号 162747 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 还是“金明的预算方案” 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2015-05-19 17:59:28 内存使用 6.03 MiB
显示代码纯文本
#include <cstdio>

using namespace std;

int group[100][5000][2],total_money,n,son[80][50],important[80],price[80],q,group_cs,f[500000],process_array[50],temp;//0 is price,1 is value
bool have_father[61];

void PLZH(int,int);
void ADD_GROUP(int);

inline int in(){
	char c=getchar();
	int x=0;
	while(c<'0'||c>'9')c=getchar();
	for(;c>='0'&&c<='9';c=getchar())x=x*10+c-48;
	return x;
}

int main()
{
	freopen("budgetb.in","r",stdin);
	freopen("budgetb.out","w",stdout);
	total_money=in();n=in();temp=in();
	total_money/=10;
    for(int i=1;i<=n;i++){
		price[i]=in();important[i]=in();q=in();
        important[i]*=price[i];price[i]/=10;
        if(q>0){
            son[q][++son[q][0]]=i;
            have_father[i]=1;
        }
    }
    for(int i=1;i<=n;i++){
        if(have_father[i]){
            continue;
        }
        else{
            group_cs++;
            if(son[i][0]==0){
                group[group_cs][0][0]=1;
                group[group_cs][1][0]=price[i];
                group[group_cs][1][1]=important[i];
            }
            else{
                temp=i;
                group[group_cs][0][0]=1;
                group[group_cs][1][0]=price[i];
                group[group_cs][1][1]=important[i];
                PLZH(1,1);
            }
        }
    }
    for(int i=1;i<=group_cs;i++){
        for(int j=total_money;j>=0;j--){
            for(int k=1;k<=group[i][0][0];k++){
                if(j<group[i][k][0]) continue;
                if(f[j]<f[j-group[i][k][0]]+group[i][k][1]){
                    f[j]=f[j-group[i][k][0]]+group[i][k][1];
                }
            }
        }
    }
    printf("%d",f[total_money]);
    return 0;
}

void PLZH(int starter,int cs_now)
{
    for(int i=starter;i<=son[temp][0];i++){
		if(price[son[temp][i]]>total_money) continue;
        process_array[cs_now]=son[temp][i];
        ADD_GROUP(cs_now);
        PLZH(i+1,cs_now+1);
    }
    return;
}

void ADD_GROUP(int gs)
{
    group[group_cs][0][0]++;
    int pc_=group[group_cs][0][0];
    group[group_cs][pc_][0]=price[temp];
    group[group_cs][pc_][1]=important[temp];
    for(int i=1;i<=gs;i++){
        group[group_cs][pc_][0]+=price[process_array[i]];
        group[group_cs][pc_][1]+=important[process_array[i]];
        if(group[group_cs][pc_][0]>total_money){
			group[group_cs][0][0]--;return;
        }
    }
    return;
}