标签:des style blog http io color ar os sp
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3787 | Accepted: 2007 |
Description
Input
Output
Sample Input
9 6 3 2 2 3 2 9 3 2 4 2 5 2 3 6 2 7 2 8 2 4 3 3 3 1 1
Sample Output
5
Source
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <cstdlib> #include <vector> #include <map> #include <algorithm> using namespace std; #define INF 0x7ffffff #define ll long long #define N 3010 struct Edge { int to,next,len; }edge[N]; int head[N],tot; int n,m; int val[N]; int num[N]; int dp[N][N]; /* dp[i][j]表示在节点i为根节点的子树,有j个叶子节点时的最大利润 */ /* 状态转移方程: dp[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]-w[i][son]); */ void init() { tot=0; memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i][j]=-INF; } } } void add(int x,int y,int z) { edge[tot].to=y; edge[tot].len=z; edge[tot].next=head[x]; head[x]=tot++; } void dfs(int u) { if(head[u]==-1) { num[u]=1; dp[u][1]=val[u]; } for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; int w=edge[i].len; dfs(v); num[u]+=num[v]; for(int j=num[u];j>=0;j--) { for(int k=0;k<=j;k++) { dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-w); } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=1;i<=n-m;i++) { int a,b,c; scanf("%d",&c); for(int j=0;j<c;j++) { scanf("%d%d",&a,&b); add(i,a,b); } } for(i=n-m+1;i<=n;i++) { scanf("%d",&val[i]); } dfs(1); for(int i=m;i>=0;i--) { if(dp[1][i]>=0) { printf("%d\n",i); break; } } } return 0; }
标签:des style blog http io color ar os sp
原文地址:http://www.cnblogs.com/hate13/p/4093921.html