題意:某電台要廣播一場比賽,該電台網路是由n個網點組成的一棵樹,其中m個點為客戶端,其餘點為**站。客戶端i願支付的錢為pay[i],每一條邊需要的花費固定,問電台在保證不虧損的情況下,最多能使多少個客戶端接收到資訊?
思路:
設dp[i][j]:表示i節點為根節點並且子樹已經有j個使用者的時候最大剩餘費用。
那麼人人為我的轉移方程式的寫法就是:
dp[i][j]=max(dp[i][j-k]+dp[v][k]); (v是i的子節點)。 (1<=k<=num[v])
注意:
1.num[v]表示v為根的子樹裡葉子節點即客戶的個數,而非子節點的個數。
2.dp轉態可能為負,所以初始化為負無窮。
然後時間複雜度我個人覺得好像是o(n^3)? 為啥沒tle? 我也不造。。。。
#include
#include
#include
using
namespace
std;
template
//n點的個數,m邊的個數
struct graph
v[n];
struct edgee[m];
void init()
void add_edge(int u,int v,int w)
};const
int n=3000+10,inf=1e9;
graph2> g;
int m,n,dp[n][n],num[n],val[n];
void dfs(int u,int f)}}
}int main()
}for(int i=1;ifor(int j=1;j<=m;j++) dp[i][j]=-inf;
}memset(num,0,sizeof(num));
for(int i=n-m+1;i<=n;i++)
dfs(1,0);
for(int i=m;i>=1;i--)}}
}
POJ 1155 TELE 樹形揹包
1為根節點,有m個葉節點,其他為中間結點,每個結點的權值代表他願意付出的錢,邊的權值代表聯通兩節點的代價,求不虧損的情況下最多能到達多少個葉節點。另dp u i 表示根節點為u的子樹此時裝了i個葉節點的盈利情況 m oney i e dgec osti 那麼我們就能得到這樣的狀態轉移方程 如果u是葉...
樹形揹包 POJ1155TELE
某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...
POJ 1155 TELE 樹形揹包問題
題目描述看的莫名其妙,很久才看懂。就是很裸的樹形揹包問題吧,狀態是dp i,j 表示節點i取到j個客戶能得到的最大收益。注意一開始初始化的時候所有j為0的時候應該是0,然後其他值都要初始化成負無窮,因為收益有可能是負值。然後做01揹包的時候注意方向,防止出現取某乙個元素多次 include incl...