最勇敢的機械人

2021-07-24 18:48:01 字數 1821 閱讀 4721

【題目描述】wind設計了很多機械人。但是它們都認為自己是最強的,於是,一場比賽開始了~

機器人們都想知道誰是最勇敢的,於是它們比賽搬運一些物品。

它們到了乙個倉庫,裡面有n個物品,每個物品都有乙個價值pi和重量wi,但是有些物品放在一起會**,並且**具有傳遞性。(a和b會**、b和c會**則a和c會**)

機器人們可不想因此損失自己好不容易從wind那裡敲詐來的裝備,於是它們想知道在能力範圍內,它們最多可以拿多少價值的物品。

你能幫助它們嗎?

【輸入格式】

第1行為n,wmax,k(0<=n,wmax,k<=1000)

接下來n行,為每個物品的pi,wi(0<=pi<=1000,1<=wi<=10,均為整數)

再接下來k行,每行2個數字a,b表示a和b會發生**

【輸出格式】

輸出1行,為最大可能價值

【樣例輸入】

3 10 1

100 1

200 5

10 5

1 2

【樣例輸出】

210

看到題面,我們就想到了揹包問題,但這道題還有其它限制。

我們把放到一起會**的放在同乙個集合中,用並查集來維護,這樣問題就轉化為了集合揹包問題。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8int n,w,k,len,v[1010],c[1010],f[1010],f[1010],s[1010],a[1010][1010

];9 inline int

read()

1013

while(isdigit(ch))

14return x*f;15}

16int find(int

x)17

20void work(int

x)21

24 len++;

25 s[len]=1

;26 a[len][s[len]]=x;

27 a[len][0]=find(x);28}

29int

main()

3042

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

43work(i);

44for(int i=1;i<=len;i++)

45for(int j=w;j>=0;j--)

46for(int k=1;k<=s[i];k++)

47if(j-c[a[i][k]]>=0) f[j]=max(f[j],f[j-c[a[i][k]]]+v[a[i][k]]);

48 printf("%d"

,f[w]);

49return0;

50 }

view code

最勇敢的機械人

時間限制 1000 ms 記憶體限制 128 mb 機器人們都想知道誰是最勇敢的,於是它們比賽搬運一些物品。它們到了乙個倉庫,裡面有n個物品,每個物品都有乙個價值pi和重量wi,但是有些物品放在一起會 並且 具有傳遞性。a和b會 b和c會 則a和c會 機器人們可不想因此損失自己好不容易從wind那裡...

vijos 1250 最勇敢的機械人

題目描述 wind設計了很多機械人。但是它們都認為自己是最強的,於是,一場比賽開始了 機器人們都想知道誰是最勇敢的,於是它們比賽搬運一些物品。它們到了乙個倉庫,裡面有n個物品,每個物品都有乙個價值pi和重量wi,但是有些物品放在一起會 並且 具有傳遞性。a和b會 b和c會 則a和c會 每個機械人的最...

Vijos P1250 最勇敢的機械人

p1250最勇敢的機械人 accepted wind設計了很多機械人。但是它們都認為自己是最強的,於是,一場比賽開始了 機器人們都想知道誰是最勇敢的,於是它們比賽搬運一些物品。它們到了乙個倉庫,裡面有n個物品,每個物品都有乙個價值pi和重量wi,但是有些物品放在一起會 並且 具有傳遞性。a和b會 b...