有依賴的01揹包問題

2021-07-22 13:53:56 字數 1926 閱讀 3286

王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子:

主件附件

電腦印表機,掃瞄器

書櫃圖書

書桌檯燈,文具

工作椅無

如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有 0 個、 1 個或 2 個附件。附件不再有從屬於自己的附件。王強想買的東西很多,為了不超出預算,他把每件物品規定了乙個重要度,分為 5 等:用整數 1 

~ 5 表示,第 5 等最重要。他還從網際網路上查到了每件物品的**(都是 10 元的整數倍)。他希望在不超過 n 元(可以等於 n 元)的前提下,使每件物品的**與重要度的乘積的總和最大。

設第 j 件物品的**為 v[j] ,重要度為 w[j] ,共選中了 k 件物品,編號依次為 j 1 , j 2 ,……, j k ,則所求的總和為:

v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 。(其中 * 為乘號)

請你幫助王強設計乙個滿足要求的購物單。

輸入描述:

輸入的第 1 行,為兩個正整數,用乙個空格隔開:n m

(其中 n ( <32000 )表示總錢數, m ( <60 )為希望購買物品的個數。)

從第 2 行到第 m+1 行,第 j 行給出了編號為 j-1 的物品的基本資料,每行有 3 個非負整數 v p q

(其中 v 表示該物品的**( v<10000 ), p 表示該物品的重要度( 1 

~ 5 ), q 表示該物品是主件還是附件。如果 q=0 ,表示該物品為主件,如果 q>0 ,表示該物品為附件, q 是所屬主件的編號)

輸出描述:

輸出檔案只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的最大值( <200000 )。

輸入例子:

1000 5

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

輸出例子:

2200
解題思路:

可以網上搜「揹包九講完整版.pdf」看一下各種揹包問題的基礎概念和演算法

核心方程:

即第i件物品放還是不放。(因為你放了可能導致其他東西不能放,所以不是一定放了更大)

解題技巧:

說了錢是10的整倍數,可以將費用先除以10,以減少遍歷複雜的,最後再乘以10即可

對主件,主件+附件1,主件+附件2,主件+附件1+附件2四種互斥的分組,可以通過第一維度相同,第二維度不同的二維陣列儲存,這樣用第一維度遍歷即可只選取四種互斥分組中的一組

#include using namespace std;

int getmax(int x, int y)

int main(); //**(成本)

int value[60][3]=; //價值(重要度***)

int f[60][3200]; //第i個物品在j容量下可以獲得的最大價值

int i,j;

cin >> n >> m;

n/=10; //都是10的整數,先除以10,減少迴圈次數

//儲存清單

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

else

else

} }//遍歷計算

for(i=1;i<=m;i++)

for(j=n;j>0;j--)

cout << f[m][n]*10 << endl;

}

注意問題:

如果以上j是從0->n迴圈則代表可以重複選,j是從n->0迴圈則代表不能重複選。因為從n->0迴圈,前面都沒有值,不會重複選到第i件物品;而從0->n迴圈,從小開始有值,當j足夠大時可能會重複選擇第i個物品。

有依賴的0 1揹包

考慮到每個主件最多只有兩個附件,因此我們可以通過轉化,把原問題轉化為01揹包問題來解決,在用01揹包之前我們需要對輸入資料進行處理,把每一種物品歸類,即 把每乙個主件和它的附件看作一類物品。處理好之後,我們就可以使用01揹包演算法了。在取某件物品時,我們只需要從以下四種方案中取最大的那種方案 只取主...

有依賴的揹包問題

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

有依賴的揹包問題

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