P1455 搭配購買(並查集 dp)

2021-10-03 08:06:41 字數 1579 閱讀 8572

題目穿越門

題目描述

明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個**上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,……,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴你一些雲朵要搭配起來買才賣,也就是說買一朵雲則與這朵雲有搭配的雲都要買,電腦組的你覺得這禮物實在是太新奇了,但是你的錢是有限的,所以你肯定是想用現有的錢買到盡量多價值的雲。

輸入格式

第1行n,m,w,表示n朵雲,m個搭配和你現有的錢的數目

第2行至n+1行,每行ci,di表示i朵雲的價錢和價值

第n+2至n+1+m ,每行ui,vi表示買ui就必須買vi,同理,如果買vi就必須買ui

輸出格式

一行,表示可以獲得的最大價值

輸入輸出樣例

輸入

5 3 10

3 10

3 10

3 10

5 100

10 1

1 33 2

4 2輸出

1說明/提示

30%的資料滿足:n<=100

50%的資料滿足:n<=1000;m<=100;w<=1000;

100%的資料滿足:n<=10000;0<=m<=5000;w<=10000.

正解

這道題正解就是並查集+01揹包

下面是思路:

答案很明顯是可以的。可以利用並查集,將這m組配對購買的商品劃到乙個集合裡,這樣就可以確定買了其中乙個就得買另乙個。

最後就是01揹包啦!

並查集ac**

#include

#include

using

namespace std;

int n,m,w,u,v,c[

10005

],d[

10005

],f[

10005

],pre[

10005];

intfind

(int x)

//找爸爸+壓縮路徑

void

bcj(

int x,

int y)

//並查集

}int

main()

for(

int i=

1;i<=n;i++

)//01揹包,年輕人都會

if(c[i]!=0

)for

(int j=w;j>=c[i]

;j--

) f[j]

=max

(f[j]

,f[j-c[i]

]+d[i]);

cout<;return0;

}

P1455 搭配購買 (並查集 01揹包)

題目描述 明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個 上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴你一些雲朵要...

洛谷 P1455 搭配購買

給定n件物品 容量為sum的揹包,購買一件物品需要購買它所依賴 的物品,求最大價值 1 並查集 2 tarjan縮點 本文採取第二種方法 將乙個強連通塊縮成乙個點,費用和價值累加,最後揹包dp即可 邊集 原圖 edge i 乙個點是否在棧內 instack i 1或0 新圖 bcc cnt 新節點費...

洛谷P1455 搭配購買

題目 題解 先用並查集維護搭配,然後將多個物品 做01揹包 注 有一些num陣列為空,不能貿然進行unique,會把不為空的相同num刪去,在01迴圈時,特判一下num.v即可 include include include using namespace std const int n 10000...