明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個**上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,……,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴你一些雲朵要搭配起來買才賣,也就是說買一朵雲則與這朵雲有搭配的雲都要買,電腦組的你覺得這禮物實在是太新奇了,但是你的錢是有限的,所以你肯定是想用現有的錢買到盡量多價值的雲。
輸入格式:
第1行n,m,w,表示n朵雲,m個搭配和你現有的錢的數目
第2行至n+1行,每行ci,di表示i朵雲的價錢和價值
第n+2至n+1+m ,每行ui,vi表示買ui就必須買vi,同理,如果買vi就必須買ui
輸出格式:
一行,表示可以獲得的最大價值
輸入樣例#1:
5 3 103 10
3 10
3 10
5 100
10 1
1 33 2
4 2
輸出樣例#1:
1
30%的資料滿足:n<=100
50%的資料滿足:n<=1000;m<=100;w<=1000;
100%的資料滿足:n<=10000;0<=m<=5000;w<=10000.
分析:其實就是把多個物品變成1個物品,然後做0-1揹包,問題就是怎麼縮點,這是個無向圖,一般就用並查集縮點,當然,也可以dfs.
#include #include#include
#include
#include
using
namespace
std;
int n,m,w,fa[10010],v1[10010],c1[10010],cnt,v[10010],p[10010],f[10010
];int find(int
x)void hebing(int x,inty)}
intmain()
for (int i = 1; i <= n; i++)
if (fa[i] ==i)
for (int i = 1; i <= cnt; i++)
for (int j = w; j >= v[i]; j--)
f[j] = max(f[j],f[j - v[i]] +p[i]);
printf(
"%d\n
",f[w]);
return0;
}
洛谷 P1455 搭配購買
給定n件物品 容量為sum的揹包,購買一件物品需要購買它所依賴 的物品,求最大價值 1 並查集 2 tarjan縮點 本文採取第二種方法 將乙個強連通塊縮成乙個點,費用和價值累加,最後揹包dp即可 邊集 原圖 edge i 乙個點是否在棧內 instack i 1或0 新圖 bcc cnt 新節點費...
洛谷P1455 搭配購買
題目 題解 先用並查集維護搭配,然後將多個物品 做01揹包 注 有一些num陣列為空,不能貿然進行unique,會把不為空的相同num刪去,在01迴圈時,特判一下num.v即可 include include include using namespace std const int n 10000...
洛谷P1455 搭配購買
明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個 上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴你一些雲朵要搭配起來買...