例子: luogu <选课>
课程有依赖关系形成树状结构,每个节点有价值a[i], 若选择X节点 则必须选择其父节点,最多选m个节点
问能获得的最大价值
f[u][i][j] 结点u,可用体积为j(节点个数),考虑前i个子节点,能获得的最大价值
我们枚举第i个点分配的体积k
f[u][i][j]= max{ f[u][i-1][j-k]+f[y][size(y)][k]
滚动数组优化
f[u][j]=max(f[u][j-k]+f[y][k]}
#include <cstdio>
const int N=304,M=2*N;
int a[N],n,m,all,nxt[M],go[M],hd[N];
int f[N][30002];
inline int max(int x,int y){
return x>y?x:y;
}
void add(int x,int y){
go[++all]=y,nxt[all]=hd[x],hd[x]=all;
}
void dp(int x){
int i,j,k,y; f[x][1]=a[x];
for(i=hd[x];i;i=nxt[i]){
y=go[i]; dp(y);
for(j=m;j>=0;j--)
for(k=0;k<j;k++){
f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]);
}
}
}
signed main(){
scanf("%d%d",&n,&m); m++;
int i,x,y;
for(i=1;i<=n;i++) scanf("%d%d",&x,a+i),add(x,i);
dp(0);
printf("%d\n",f[0][m]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!