有依賴的揹包問題

2022-07-08 21:36:12 字數 1190 閱讀 9589

原題鏈結有依賴的揹包問題

題目描述

有依賴的揹包問題是指物品之間存在依賴關係,這種依賴關係可以用一棵樹來表示,要是我們想要選擇子節點就必須連同父節點一塊選。

我們可以吧有依賴的揹包問題看成是分組揹包問題中的乙個組,子節點的每一種選擇我們都看作是組內的一種物品,因此我們可以通過分組揹包的思想去寫。

但它的難點在於如何遍歷子節點的每一種選擇,即組內的物品,我們的做法是從葉子節點開始往根節點做,並使用陣列表示的鄰接表來儲存每個節點的父子關係。

參考**

#include#include#includeusing namespace std;

const int n = 110;

int n,m;

int h[n],e[n],ne[n],idx;

/*h陣列是鄰接表的頭它的下表是當前節點的標號,值是當前結點第一條邊的編號(其實是最後加入的那一條邊),e陣列是邊的集合,它的下標是當前邊的編號,數值是當前邊的終點;

這樣我們就知道了當前結點的第一條邊是幾,這個邊的終點是那個結點,該節點的下一條邊編號是幾,那麼鄰接表就完成了

*/ int v[n],w[n],f[n][n];

void add(int a,int b)

void dfs(int u)}}

//加上剛剛預設選擇的父節點價值

for(int i = m;i>=v[u];i--)

//因為我們是從葉子結點開始往上做,所以如果揹包容積不如當前物品的體積大,那就不能選擇當前結點及其子節點,因此賦值為零

for(int i = 0;i>n>>m;

int root;

for(int i = 1;i<=n;i++)else

}dfs(root);

cout<

return 0;

}

有依賴的揹包問題

簡化的問題 這種揹包問題的物品間存在某種 依賴 的關係。也就是說,i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴 另外,沒有某件物品同時依賴多件物品。演算法 這個問題由noip2006金明的預算方案一題擴充套件而來。遵從該題的提法,...

有依賴的揹包問題

第二天叫醒我的不是鬧鐘,是夢想!有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節...

有依賴的揹包問題

題目鏈結 有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。如下圖所示 如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點編號是 ...