vijos 1250 最勇敢的機械人

2021-07-14 20:17:39 字數 1316 閱讀 6427

題目描述

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

機器人們都想知道誰是最勇敢的,於是它們比賽搬運一些物品。它們到了乙個倉庫,裡面有n個物品,每個物品都有乙個價值pi和重量wi,但是有些物品放在一起會**,並且**具有傳遞性。(a和b會**、b和c會**,則a和c會**)。

每個機械人的最大承載重量為wmax,請問它們最多可以拿多少價值的物品。

你能幫助它們嗎?

輸入格式

第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[樣例說明]

共有3個物品,1,2兩個不能一起。

我們可以選擇2和3號物品,價值為200+10=210,重量是5+5=10,剛剛能夠搬走

對於100%的資料n<=1000,wmax,k<=1000

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

還記得那個每組只能取乙個的分組揹包嗎?這裡就是乙個經過包裝的模型,我們可以通過並查集進行分組,然後dp

for i 組

for j 重量

for k 遍歷組內物品

為什麼j要在外面呢?我們簡單證明一下:

物品1重量為x,物品2重量為y

如果兩個都裝,那麼就要x+y,也就是說,當j=x+y時,遍歷第二個物品時,

f[x]必須已經包含裝有物品1的資訊,可是

xy ,當時j還沒迴圈到,自然可以避免裝在一起。

#include

#include

#include

using

namespace

std;

int a[1005],b[1005],fa[1005];

int g[1005][1005],f[1005];

int n,m,k,x,y,u,v;

int get(int x)

int main()

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

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

if(g[i][0])

}cout

0;}

vijos1250 最勇敢的機械人

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

Vijos P1250 最勇敢的機械人

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

最勇敢的機械人

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