依赖背包优化——hdu1561

 傻逼依赖背包的优化

#include<bits/stdc++.h>
using namespace std;
#define N 205
struct Edge{int to,nxt;}e[N<<1];
int head[N],tot,n,m,a[N];
void init(){memset(head,-1,sizeof head);tot=0;}
void add(int u,int v){
    e[tot].to=v;e[tot].nxt=head[u];head[u]=tot++;
}
int dp[N][N];
void dfs(int u,int pre,int C){
    for(int i=head[u];i!=-1;i=e[i].nxt){
        int v=e[i].to;
        if(v==pre)continue;
        for(int j=0;j<=C-1;j++)
            dp[v][j]=dp[u][j]+a[v];
        dfs(v,u,C-1);
        for(int j=1;j<=C;j++)
            dp[u][j]=max(dp[u][j],dp[v][j-1]);
    }
}

int main(){
    while(cin>>n>>m && n){
        init();
        for(int i=1;i<=n;i++){
            int fa;cin>>fa>>a[i];
            add(i,fa);add(fa,i);
        }
        memset(dp,0,sizeof dp);
        dfs(0,0,m);
        int ans=0;
        for(int j=0;j<=m;j++)
            ans=max(ans,dp[0][j]);
        cout<<ans<<endl;
    }
} 

 

posted on 2019-08-21 00:41  zsben  阅读(153)  评论(0编辑  收藏  举报

导航