題解 洛谷P1273 有線電視網(樹上分組揹包)

2022-05-05 20:39:07 字數 1092 閱讀 7627

次元傳送門:洛谷p1273

一開始想的是普通樹形dp 但是好像實現不大好

觀摩了一下題解

是樹上分組揹包

設f[i][j]為以i為根的子樹中取j個客戶得到的總價值

我們可以以i為根有j組

在每一組中分別又取1個,2個,3個......n個客戶

化為揹包思想即j為一共有j組揹包容量為每組的客戶數總和 把該節點的每個兒子看成一組 每組中的元素為選乙個,選兩個...選n個使用者

狀態轉移方程:

f[i][j]=max(f[i][j],f[i][j-k]+f[v][k]-邊權);//i為根 j為容量

最後輸出f[1][i]>=0的i的最大值所以反向列舉

#include#include

using

namespace

std;

#define maxn 3010

#define inf 1e9+7

intf[maxn][maxn];

inth[maxn],val[maxn];

intn,m,cnt;

struct

edge

e[maxn*maxn];

void add(int u,int v,int

w)int dfs(int

u)

int t,sum=0;//

t為當前組有幾個客戶 sum為揹包容量

for(int i=h[u];i;i=e[i].next)//

列舉組

}return

sum;

}int

main()

}for(int i=n-m+1;i<=n;i++) cin>>val[i];

for(int i=1;i<=n;i++) f[i][0]=0;//

初始化 取0個客戶的花費為0

dfs(1

);

for(int i=m;i>=1;i--)//

反向列舉

}}

有線電視網 洛谷p1273

某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...

有線電視網 洛谷 P1273

只能想到n 3的辦法 一看資料量自閉了。看了題解也是n 3 智障出題人 dp i j 代表以i為根的子樹選j個使用者時得到的最大收益 然後就是樹上揹包轉移一下 最後看根節點上最多選幾個人不虧本 include include include using namespace std const int...

有線電視網 洛谷P1273

題目描述 某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使...