也是一道紫书上所说的树型DP。但是我觉得这题没有发挥dp存储中间结果的优势,每个子问题其实只需要计算一次,可以算是一个树的深度优先遍历,然后贪心作出选择。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define INF 1000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
using namespace std;
vector<int> emp[100010];
int N;//员工数
int T;//百分比
int fun(int x){
if(emp[x].size()==0)return 1;
vector<int> t;
int cnt=(int)ceil((double)emp[x].size()*T/100);
for(int i=0;i<emp[x].size();i++){
t.push_back(fun(emp[x][i]));
}
sort(t.begin(),t.end());
int re=0;
for(int i=0;i<cnt;i++)re+=t[i];
return re;
}
int main(){
while(cin>>N>>T){
if(N==0&&T==0)break;
for(int i=0;i<=N;i++)emp[i].clear();
int boss;
for(int i=1;i<=N;i++){
scanf("%d",&boss);
emp[boss].push_back(i);
}
cout<<fun(0)<<endl;
}
return 0;
}