hdu 3593 The most powerful force (树形dp+背包)

来源:互联网 发布:姗姗手帐小铺 淘宝 编辑:程序博客网 时间:2024/06/07 06:27
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#define N  100005using namespace std;int n,g,c[N],val[N],dp[505][10005];vector<int>edge[N];void dfs(int u,int vol){        int i,len=edge[u].size(),v,j;        for(i=0;i<len;i++){                v=edge[u][i];                if(edge[v].empty()) { // v is leaf                        for(j=vol;j>=c[v];j--){                                dp[u][j]=max(dp[u][j],dp[u][j-c[v]]+val[v]);                        }                }                else{                        for(j=vol-c[v];j>=0;j--) dp[v][j]=dp[u][j];                        dfs(v,vol-c[v]);                        for(j=vol;j>=c[v];j--)  dp[u][j]=max(dp[u][j],dp[v][j-c[v]]+val[v]);                }        }}int main(){        while(~scanf("%d%d",&n,&g)){                int i,f;                memset(dp,0,sizeof(dp));                for(i=0;i<=n;i++) edge[i].clear();                for(i=1;i<=n;i++){                        scanf("%d%d%d",c+i,val+i,&f);                        if(f==i) edge[0].push_back(i);                        else edge[f].push_back(i);                }                dfs(0,g);                printf("%d\n",dp[0][g]);        }        return 0;}
0 0