题目描述
好吧_我太懒了……
分析
题目分析
典型的树形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