HAOI2010 軟體安裝

2022-05-19 09:55:28 字數 1081 閱讀 6177

題目:洛谷p2515、bzoj2427、codevs1866。

題目大意:有n個物品,每個物品有重量和價值,且只能選一次。每個物品可能有乙個依賴物品,選了該物品必須先選擇它的依賴物品(可能會有環)。給出揹包的容量,求可以裝物品的最大價值。

解題思路:首先強連通分量縮點,然後樹形dp求01揹包即可。

c++ code:

#includeint n,m,fa[105],w[105],v[105],dfn[105],low[105],idx=0,ys[105],ltfl=0,dad[105];

std::vectora[105];

int f[105][505],w[105],v[105],ans=0,cnt=0,head[105];

bool instack[105];

std::stacks;

inline int debian()

struct edgee[66667];

void tarjan(int now)else

}if(low[now]==dfn[now])while(p!=now);

}}void dp(int now)

memset(f,0,sizeof f);

memset(head,0,sizeof head);

//for(int i=1;i<=ltfl;++i)fprintf(stderr,"%d: %d %d %d\n",i,dad[i],w[i],v[i]);

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

head[dad[i]]=cnt;

}dp(0);

for(int i=0;i<=m;++i)

if(f[0][i]>ans)ans=f[0][i];

//for(int i=0;i<=ltfl;++i,putchar('\n'))

//for(int j=0;j<=m;++j)printf("%d ",f[i][j]);

return!printf("%d\n",ans);

}

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

開始沒有看懂題,以為就是個樹形依賴揹包,打完之後w40,然後才發現它會有還,要用tarjan縮完點後跑揹包,要建立乙個虛擬節點0連線所有的子圖 注意連線的位置 錯誤示範 1 for int i 1 i n i 這樣會導致0連線的不是入度為0的點 或環 2if dsn i 3 正確 1 for int...