給定n件物品 容量為sum的揹包,購買一件物品需要購買它所依賴(**)的物品,求最大價值
1、並查集本文採取第二種方法2、tarjan縮點
將乙個強連通塊縮成乙個點,費用和價值累加,最後揹包dp即可
邊集(原圖):edge[i]乙個點是否在棧內:instack[i]=1或0
新圖:bcc[cnt]
新節點費用:bcc.dis,價值:bcc.value
#include
#define maxm 5010
#define maxn 10010
using
namespace
std;
struct edge
edge[2*maxm];
struct number
bcc[maxn];
int w[maxn],c[maxn],dp[maxn],dfn[maxn],low[maxn],head[maxn];
int n,m,sum,num=0,times=0,cnt=0;
void addedge(int from,int to)
; head[from]=num;
}stack
s;int instack[maxn];
void tarjan(int u)
else
if (instack[v])
} //正常的tarjan
if (dfn[u]==low[u]) // 縮點
while (u!=v);
}}int main()
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
for (int i=1;i<=n;i++)
if (!dfn[i]) tarjan(i);
for (int i=1;i<=cnt;i++)
for (int j=sum;j>=bcc[i].dis;j--) dp[j]=max(dp[j],dp[j-bcc[i].dis]+bcc[i].value);//正常的揹包dp
printf("%d",dp[sum]);
//聽說有**的出題人卡這個,可以加上ans=max(dp);但是lg的資料過了
}
完。 洛谷P1455 搭配購買
題目 題解 先用並查集維護搭配,然後將多個物品 做01揹包 注 有一些num陣列為空,不能貿然進行unique,會把不為空的相同num刪去,在01迴圈時,特判一下num.v即可 include include include using namespace std const int n 10000...
洛谷P1455 搭配購買
明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個 上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴你一些雲朵要搭配起來買...
洛谷P1455 搭配購買
明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個 上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴你一些雲朵要搭配起來買...