【題目描述】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 #include7view codeusing
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 }
最勇敢的機械人
時間限制 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...