Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built underground. It is actually a huge cavern, which consists of many rooms connected with tunnels. Each room is occupied by some bugs, and their brains hide in some of the rooms. Scientists have just developed a new weapon and want to experiment it on some brains. Your task is to destroy the whole base, and capture as many brains as possible.
5 10 50 10 40 10 40 20 65 30 70 30 1 2 1 3 2 4 2 5 1 1 20 7 -1 -1
50 7
/**
hdu 1011 樹形dp背包
題目大意:一棵樹有n個節點,每個節點有一定的bug值和價值,一個人從1出發有m個兵(1個兵可以打20個bug),經過一個點
要留下足夠的兵才能往下走並且獲得該點的價值,問如何用m個兵獲得最大的價值
解題思路:背包問題。狀態轉移方程為:dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);(j:num~m;k:1~j-num;u為v的父親節點)
注意:房間bug數目為0,也要一個士兵。
*/
#include
#include
#include
#include
using namespace std;
const int maxn=105;
int head[maxn],ip;
int n,m,dp[maxn][maxn],a[maxn],b[maxn];
struct note
{
int v,next;
}edge[maxn*4];
void init()
{
memset(head,-1,sizeof(head));
ip=0;
}
void addedge(int u,int v)
{
edge[ip].v=v,edge[ip].next=head[u],head[u]=ip++;
}
void dfs(int u,int pre)
{
int num=(a[u]+19)/20;///獲得該結點需要的士兵數目
for(int i=num;i<=m;i++)
dp[u][i]=b[u];
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(v==pre)continue;
dfs(v,u);
for(int j=m;j>=num;j--)
{
for(int k=1;k+num<=j;k++)
{
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
}
}
}
int main()
{
while(~scanf(%d%d,&n,&m))
{
if(n==-1&&m==-1)break;
for(int i=1;i<=n;i++)
{
scanf(%d%d,&a[i],&b[i]);
}
init();
for(int i=0;i