/*
這道題還不錯,自己想出了思路過得也比較快,也得出了乙個小經驗,以後寫這種題先把關鍵部分偽**寫出來這樣會快很多而且
不那麼容易出錯,省去很多的除錯時間
這道題就是轉化為一道樹形揹包問題。首先把需要付的錢轉為負數,對每個葉子結點增加乙個子節點表示賺的錢,為正數.
然後記錄下當前結點的所有可能的使用者數目所花費的錢.所以問題就轉化為一道簡單的樹形dp問題。最後找出盈利為非負數的最大
使用者數即可.
有一點要注意dp陣列初始化為乙個很大的負數,剛開始因為這個問題wa了一遍
用到了num陣列存放每個結點的葉子結點的數目,起到很好的優化作用。
*/
#include#include#include#include#includeusing namespace std;
#define maxn 6005
int dp[maxn][maxn],num[maxn],val[maxn];
vectorsons[maxn];
//num對於優化起了很大的作用,來記錄當前結點子樹中的葉子結點數目
void dfs(int rt)}}
}void init()
}int main()
}for(i=n+1;i<=n+m;i++)
dfs(1);
print();
}return 0;
}
POJ 1155 TELE 樹形揹包
1為根節點,有m個葉節點,其他為中間結點,每個結點的權值代表他願意付出的錢,邊的權值代表聯通兩節點的代價,求不虧損的情況下最多能到達多少個葉節點。另dp u i 表示根節點為u的子樹此時裝了i個葉節點的盈利情況 m oney i e dgec osti 那麼我們就能得到這樣的狀態轉移方程 如果u是葉...
樹形揹包 POJ1155TELE
某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...
POJ 1155 TELE (樹形DP,樹形揹包)
題意 給定一棵樹,n個節點,其中有m個葉子表示的是使用者,其他點表示中轉器,每條邊都有權值,每個使用者i願意給的錢w i 問如果在不虧錢的情況下能為多少使用者轉播足球比賽?思路 其實就是要選出部分葉子節點,其花費 所選葉子權值 經過的所有邊權 每條邊只算1次花費 那麼對於每個節點,可以考慮在其子樹下...