hdu 1561 选某个物品前必须选特定的其它物品,求最大价值

来源:互联网 发布:windows 安卓扩展屏幕 编辑:程序博客网 时间:2024/05/17 06:21
#include<cstdio>#include<cstring>#define MAX(x,y) ((x)>(y)?(x):(y))struct node{int to,next;}e[220];int head[220],cnt,n,m,dp[220][220],v[220],vis[220];void add_edge(int from,int to){e[cnt].to=to;e[cnt].next=head[from];head[from]=cnt++;}void dfs(int x){//printf("x=%d \n",x);dp[x][1]=v[x];vis[x]=1; for(int i=head[x];i!=-1;i=e[i].next){int to=e[i].to;dfs(to);for(int k=m+1;k>0;k--){for(int j=1;j<k;j++)dp[x][k]=MAX(dp[x][k],dp[x][k-j]+dp[to][j]);}//for(int k=0;k<=m+1;k++) //printf("%d ",dp[x][k]);//printf("\n");}}int main(){cnt=0; while(~scanf("%d%d",&n,&m)&&(n+m)){memset(v,0,sizeof(v));     memset(head,-1,sizeof(head));     memset(dp,0,sizeof(dp));     cnt=0;     for(int i=1;i<=n;i++)    {    int x;     scanf("%d%d",&x,&v[i]);    add_edge(x,i);    }        dfs(0);        printf("%d\n",dp[0][m+1]);     }}

0 0
原创粉丝点击