uva 12168

来源:互联网 发布:学生怒骂日本记者知乎 编辑:程序博客网 时间:2024/06/04 00:58

这一题是树形dp,说是dp,感觉还不如说是暴力回溯。参考紫书。

#include<cstdio>#include<vector>#include<algorithm>using namespace std;const int maxn = 100000 + 5;vector<int> sons[maxn];int n, t;int dp(int n){    if(sons[n].empty()) return 1;    int k = sons[n].size();    int c = ((k * t) - 1 )/ 100 + 1;    vector<int> v;    for(int i = 0; i < k; i++)        v.push_back(dp(sons[n][i]));    sort(v.begin(), v.end());    int ans = 0;    for(int i = 0; i < c; i++)        ans += v[i];    return ans;}int main(){    while(scanf("%d%d", &n, &t) == 2 && n && t)    {        for(int i = 0; i <= n; i++)            sons[i].clear();        for(int i = 1; i <= n; i++)        {            int temp;            scanf("%d", &temp);            sons[temp].push_back(i);        }        printf("%d\n", dp(0));    }    return 0;}