题意:给你一颗带有权值的树,接着一个有能量的机器人,每经过一个边就要消耗对应权值的能量,求你x点能量最大能经过你几个结点
题解:我们可以dp出我 走i个点消耗最小的能量,因为我只有两种情况要么从另外一颗子树经过 j个结点然后走回来或者从另外一颗子树走j个结点不会来,所以我们要记录一些该节点走j个结点回来的最小值和不回来的最小值,接着可得转移方程就是
dp[u][i].fi = min(dp[u][i-j].fi+dp[v][j].se+2*w,min(dp[u][i].fi,dp[v][j].fi+dp[u][i-j].se+w));
dp[u][i].se = min(dp[u][i].se,dp[v][j].se+dp[u][i-j].se+2*w);
fi表示不走回来使用最少能量,se表示走回来使用最小能量,接着我们可以用0-1背包的思想先把i从后往前更新确保前面的更新不会影响后面的更新接着最后因为结点最大只有500,查询只有1W,二分暴力查询都可以
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<cstdlib>
#include<ctime>
#include<stack>
usi