題目:洛谷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...