又沒有背景……後期有時間再……
——————————————
http://codevs.cn/problem/1163/
題目描述 Description
皮爾是一個出了名的盜畫者,他經過數月的精心準備,打算到藝術館盜畫。藝術館的結構,每條走廊要麼分叉爲二條走廊,要麼通向一個展覽室。皮爾知道每個展室裏藏畫的數量,並且他精確地測量了通過每條走廊的時間,由於經驗老道,他拿下一副畫需要5秒的時間。你的任務是設計一個程序,計算在警察趕來之前(警察到達時皮爾回到了入口也算),他最多能偷到多少幅畫。
輸入描述 Input Description
第1行是警察趕到得時間,以s爲單位。第2行描述了藝術館得結構,是一串非負整數,成對地出現:每一對得第一個數是走過一條走廊得時間,第2個數是它末端得藏畫數量;如果第2個數是0,那麼說明這條走廊分叉爲兩條另外得走廊。數據按照深度優先得次序給出,請看樣例
輸出描述 Output Description
輸出偷到得畫得數量
樣例輸入 Sample Input
60
7 0 8 0 3 1 14 2 10 0 12 4 6 2
樣例輸出 Sample Output
2
數據範圍及提示 Data Size & Hint
s<=600
走廊的數目<=100
——————————————
tree[i][j]表示i節點拿j個畫需要多少時間
完後……就完了啊!!!
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int tree[201][601];
int dis[201][201];
int t;
const int INF=214748364;
int hua[201]={0};
int sum=0;
void read(int fa,int i){
scanf("%d",&dis[fa][i]);
int ha;
scanf("%d",&ha);
if(ha==0){
read(i,i*2);
read(i,i*2+1);
hua[i]=hua[i*2+1]+hua[i*2];
for(int j=0;j<=hua[i];j++){
for(int k=0;k<=j;k++){
int f=0;
if(k!=0)f+=dis[i][i*2]*2;
if(j-k!=0)f+=dis[i][i*2+1]*2;
tree[i][j]=min(tree[i][j],tree[i*2][k]+tree[i*2+1][j-k]+f);
}
}
}else{
hua[i]=ha;
sum+=ha;
for(int j=0;j<=ha;j++){
tree[i][j]=j*5;
}
}
return;
}
int main(){
scanf("%d",&t);
for(int i=0;i<=200;i++){
tree[i][0]=0;
for(int j=1;j<=600;j++){
tree[i][j]=INF;
}
}
read(1,2);
for(int i=sum;i>=0;i--){
if(tree[2][i]+dis[1][2]*2<=t){
printf("%d",i);
return 0;
}
}
return 0;
}