标签:inf amp 分组 背包 分配 getc mat p12 har
1.树形背包
洛谷P1273有线电视网==poj1155tele
//一个孩子一个分组,枚举每个组选几个(给每个孩子分配体积) //沙茶的输出打错了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=3e3+5,INF=1e9; int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘; c=getchar();} return x*f; } int n,m,s,v,w; struct edge{ int v,w,ne; }e[N<<1]; int h[N],cnt=0; void ins(int u,int v,int w){ cnt++; e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt; cnt++; e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt; } int d[N][N],son[N]; void dfs(int u,int fa){ if(u>=n-m+1) return; for(int j=1;j<=m;j++) d[u][j]=-INF; for(int i=h[u];i;i=e[i].ne){ int v=e[i].v,w=e[i].w; if(v==fa) continue; dfs(v,u); son[u]+=son[v]; for(int j=son[u];j>=1;j--){ int t=min(j,son[v]); for(int k=1;k<=t;k++) d[u][j]=max(d[u][j],d[u][j-k]+d[v][k]-w); } } } int main(){ n=read();m=read(); for(int i=1;i<=n-m;i++){ s=read(); while(s--){v=read();w=read();ins(i,v,w);} } for(int i=n-m+1;i<=n;i++) d[i][1]=read(),son[i]=1; dfs(1,0); for(int i=m;i>=1;i--) if(d[1][i]>=0) {printf("%d",i);break;} }
标签:inf amp 分组 背包 分配 getc mat p12 har
原文地址:http://www.cnblogs.com/candy99/p/6071833.html