物件捆綁背包問題:給定N元錢,要購買一些器件。器件有主件和附件之分,也即主件可以單獨購買,然而購買附件必須購買對應的主件。下表就是一些主件與附件的例子:
主件
附件
電腦
列印機、掃描器
書櫃
圖書
書桌
台燈
工作椅
無
把每件物品規定一個重要度,分為5等:用整數1~5表示,第5等最重要。在花費不超過N元(可以等于N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。設第j件物品的價格為v[j],重要度為p[j],共選中了k件物品,編号依次為j1,j2,……,jk,則所求的總和為:v[j1]*p[j1]+v[j2]*p[j2]+ …+v[jk]*p[jk]。
輸入
第1行,為兩個正整數,用一個空格隔開:N m
從第2行到第m+1行中,第j行給出了編号為j-1的物品基本資料,每行有3個非負整數: v p q(v:物品價格,p:物品重要度,q:主件還是附件。q=0為主件;q>0為附件,q是所屬主件的編号)
輸出
輸出為不超過總錢數的物品的價格與其重要度乘積的總和的最大值。
動态規劃求解:
1)思路:同一般的背包問題不同的是,在購買附件的同時必須要購買相應的主件。我們需要對主,附件做捆綁。每一種捆綁結果作為一種購買方式,之後同一般的背包問題
例如:主件A,有附件B、附件C,則由數理統計的知識可知有4中購買方式,即(A,A+B,A+C,A+B+C)。
附件個數為n-1時的購買方式個數為:
2)主附件捆綁的資料結構選擇:
因為一件附件隻有一個主件,為了捆綁的友善性,可以采用連結清單的形式。主件為頭結點,拉鍊為附件節點。如下所示:
3)問題求解