原題鏈結有依賴的揹包問題
題目描述
有依賴的揹包問題是指物品之間存在依賴關係,這種依賴關係可以用一棵樹來表示,要是我們想要選擇子節點就必須連同父節點一塊選。
我們可以吧有依賴的揹包問題看成是分組揹包問題中的乙個組,子節點的每一種選擇我們都看作是組內的一種物品,因此我們可以通過分組揹包的思想去寫。
但它的難點在於如何遍歷子節點的每一種選擇,即組內的物品,我們的做法是從葉子節點開始往根節點做,並使用陣列表示的鄰接表來儲存每個節點的父子關係。
參考**
#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,依賴的父節點編號是 ...