題目描述
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會 機器人們可不想...