P6223 PODJELA
2023.10.6 16:46 luogu solution
一道不错的树上背包题。
为了方便,我们先让拿到的钱减去给定值。那么此时因为要使所有农民的值
当
(
否则,我们可以选择是否与
然后注意一下代码细节即可。(用临时数组是因为我经常搞错转移顺序,而且有些背包题不能直接转移必须要临时数组,所以这里就直接用了)
int n,f[N][N],siz[N],g[N]; vector<int>F[N]; void dfs(int x,int fa){ for(int y:F[x])if(y^fa){ dfs(y,x); for(int i=0;i<=siz[x]+siz[y];i++)g[i]=-1e9;//赋初值 for(int i=0;i<siz[x];i++) for(int j=0;j<siz[y];j++){ if(f[j][y]>=0)//可以不合并 g[i+j]=max(g[i+j],f[i][x]); g[i+j+1]=max(g[i+j+1],f[i][x]+f[j][y]);//合并 } for(int i=(siz[x]+=siz[y]);~i;--i)//赋值回去 f[i][x]=g[i]; } } int main(){ n=read(); memset(f,-0x3f,sizeof(f));//赋初值 for(int i=1,V=read();i<=n;i++) f[0][i]=V-read(),siz[i]=1; for(int i=1,u,v;i<n;i++) F[u=read()].push_back(v=read()),F[v].push_back(u); dfs(1,0); for(int i=0;i<=n;i++) if(f[i][1]>=0) return printf("%d",i),0; }
end:17:01
本文作者:NBestの思潮
本文链接:https://www.cnblogs.com/NBest/p/17744730.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步