【C++】金明的预算方案

本文介绍了一种解决树形DP问题的方法,通过分析题目关键信息,提出五种状态,并给出复杂度为O(2^n)的状态转移方程。虽然在附件较少的情况下较简单,但当附件数量增加时,复杂度较高,可能不如传统树状DP高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目描述

好吧_我太懒了……

题目链接


分析

题目分析

典型的树形DP,不过我不会但是我用的是另外一种 分析题目 的方法。
每个主件可以有0个、1个或2个附件。
没错,这几个字就是关键!

状态分析

可以有这样five kinds of状态:

1) 不选该件物品
2) 只选主件
3) 选主件+第一个附件
4) 选主件+第二个附件
5) 选主件+第一个附件+第二个附件

状态转移方程

总结成状态转移方程就是 :

dp[j]=max{
   
   
dp[j],
dp[j-v[i]]+w[i],
dp[j-v[i]-v[son[i][1]]]+w[i]+w[son[i][1]],
dp[j-v[i]-v[son[i][2]]]+w[i]+w[son[i][2]],
dp[j-v[i]-v[son[i][1]]-v[son[i][2]]+w[i]+w[son[i][1]]+w[son[i][2]]}

虽然看上去状态转移方程很复杂,实际写出来也很复杂其实是很好写的。

所以状态转移方程一出来,DP也就有解了……

总结

如果这道题可以有无限个附件的话,这个方案的复杂度就很大,最多有O(2^n),所以这个方法在一个物体的附件较少的情况下使用。

可能较正解树状DP要简单一些,不过数据大了我也不知道要慢多少
(想一想0-1背包O(2^n) 和 O(VN)的差距吧 )……

附上代码

#include<cstdio>
#incl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值