目录
分组背包题
这次是自己写的代码了,也就瞟了标准答案几眼,真的就几眼
用的也是vector邻接表[code]#include#includeusing namespace std;vector zi[110];//zi[j]:i的第j个孩子 (j动态大小 int a[110],m,n,f[110][110];//f[j]:以i为根最多选j和节点,最大值 void maketree(int root){ for(int i=0;i=1;j--) for(int k=j;k>=1;k--) f[root][j]=max(f[root][j],f[root][j-k]+f[zi[root]][k]); } if(root!=0) for(int i=m;i>=1;i--) f[root]=f[root][i-1]+a[root];}int main(){ cin>>m>>n;//m:待选,n:可选 for(int i=1;i>x>>y; zi[x].push_back(i);//表示x的孩子再多一个i a=y; } maketree(0); cout>n; for(int i=1;i>c; for(int i=1;i>x>>y; add(x,y); add(y,x); } dp(n+1,-1);//随便选一个不是叶子的节点都行,没有父亲为-1 cout |