首页 > 代码库 > hdu 1561 The more, The Better
hdu 1561 The more, The Better
找到一个size=M 权值最大的子树;
多么明显 有依赖性的 01背包!这个依赖点是0 直接上代码:
#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <cstdlib>using namespace std;const int maxn=205;const int INF=0x7ffffff;struct Edge{ int to,dis,pre; Edge(int to=0,int dis=0,int pre=0):to(to),dis(dis),pre(pre){}};int n,m;Edge edge[maxn];int head[maxn],pos;int dp[maxn][maxn];int money[maxn];void inint(){ memset(dp,0,sizeof(dp)); memset(head,-1,sizeof(head)); pos=0;}void add_edge(int s,int to,int dis){ edge[pos]=Edge(to,dis,head[s]); head[s]=pos++;}int dfs(int s){ int ans,key; ans=1,dp[s][1]=money[s]; for(int w=head[s];~w;w=edge[w].pre) { Edge &tmp=edge[w]; key=dfs(tmp.to); ans+=key; for(int i=ans;i>=1;i--) for(int j=1;j<=key&&(j<i);j++) dp[s][i]=max(dp[s][i],dp[s][i-j]+dp[tmp.to][j]); } return ans;}int main(){ int a; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; inint(); for(int i=1;i<=n;i++) { scanf("%d%d",&a,&money[i]); add_edge(a,i,1); } dfs(0); printf("%d\n",dp[0][m+1]); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。