SSL ZYC 2347 搭配購買

2022-09-03 07:12:14 字數 727 閱讀 4394

題目大意:

現在有n件商品,其中m組買了乙個就必須買另外乙個。求k元錢的最大價值。

思路:如果沒有第二句話就是乙個普通的01揹包。

既然這樣,那這道題是否可以轉換為01揹包呢?

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

最後就是01揹包啦!

**:

#include 

#include

#include

using

namespace

std;

int father[20001],c[20001],w[20001],f[20001];

int n,m,k,x,y;

int find(int x) //並查集

int main()

for (int i=1;i<=m;i++)

for (int i=1;i<=n;i++)

if (father[i]!=i) //如果買了這一件商品就得買另一件商品

for (int i=1;i<=n;i++)

for (int j=k;j>=w[i];j--)

f[j]=max(f[j],f[j-w[i]]+c[i]); //01揹包

printf("%d\n",f[k]);

return

0;}

1387 搭配購買 buy

題目描述 joe覺得雲朵很美,決定去山上的商店買一些雲朵。商店裡有n朵雲,雲朵被編號為1,2,n,並且每朵雲都有乙個價值。但是商店老闆跟他說,一些雲朵要搭配來買才好,所以買一朵雲則與這朵雲有搭配的雲都要買。但是joe的錢有限,所以他希望買的價值越多越好。輸入 第1行n,m,w,表示n朵雲,m個搭配,...

T1387 搭配購買 buy

joe覺得雲朵很美,決定去山上的商店買一些雲朵。商店裡有n朵雲,雲朵被編號為1,2,n,並且每朵雲都有乙個價值。但是商店老闆跟他說,一些雲朵要搭配來買才好,所以買一朵雲則與這朵雲有搭配的雲都要買。但是joe的錢有限,所以他希望買的價值越多越好。第1行n,m,w,表示n朵雲,m個搭配,joe有w的錢。...

洛谷 P1455 搭配購買

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