这是一个典型的树形背包+01分数规划。看见分数形式最大就应该想到01分数规划。
于是套用分数规划,每次用树形背包检验。
首先这是一棵树,不是一个森林,所以我们不用添加虚点。然后可以列出dp方程,具体代码。
然后每个点如果自己选了,那么父亲也要选,所以更新的时候,除了jyy也就是0号节点,都是从dp[u][1]开始更新,而且初值就是dp[u][0]=0dp[u][1]=val,因为儿子选了,自己肯定会选,所以不能出现
每次背包要从大到小枚举,常见技巧。
然后判断即是dp[0][k]>=0。
但是又有一个问题:val[0]是什么?如果是0的话,那么不就无法判断了?
那么我们这么设置一下,当u=0时,j可以枚举到0,因为jyy不算在k里,所以jyy就可以出现dp[0][i]=dp[0][0]+dp[v][i]的情况。但是val[0]还是设置成-inf,这样才可以取到最大值,否则一上来dp[0][1]就是0了。