#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
#define num 700
int tree[num];
int dp[num][num];//dp[i][j]表示i节点在j时间能取得的最多的画为多少
void search(int root,int maxtime)//maxtime表示可能分配给root节点的最多时间
{
if(tree[root*2+1]==-1)//叶子了
{
int val = tree[root]*2;
for(int i =1;i<=tree[root*2];i++)
{
dp[root][val+i*5]=i;
}
for(int i =1;i<=maxtime;i++)
if(dp[root][i]==0&&dp[root][i-1])
dp[root][i]=dp[root][i-1];
return;
}
int val = tree[root]*2;
search(root*2,maxtime-val);
search(root*2+1,maxtime-val);
for(int i =1;i<=maxtime;i++)
for(int p =0;p<=i;p++)
{
int t1 = dp[root*2][p];
int t2 = dp[root*2+1][i-p];
if(t1+t2>dp[root][i+val])dp[root][i+val] =t1+t2;
}
}
int main()
{
int time;
cin>>time;
int index = 1;
stack<int>s;
s.push(index);
memset(dp,0,sizeof(dp));
while(s.size())//用先序遍历进行插入,先根节点,后左子树,再右子树,用栈建树
{
index = s.top();
s.pop();
int a,b;
cin>>a>>b;
tree[index]=a;
if(b==0)
{
s.push(index*2+1);
s.push(index*2);
}
else
{
tree[index*2]=b;
tree[index*2+1]=-1;
}
}
search(1,time);
cout<<dp[1][time]<<endl;
return 0;
}
1163 访问艺术馆
最新推荐文章于 2017-06-22 18:58:00 发布