1、揹包問題的描述算法
揹包問題能夠有多種形式,下面將對其逐一進行描述:數組
(1)經典的0-1揹包問題(無物品的價值):數據結構
假設有一個能裝入容量爲C的揹包和n件重量分別爲w1,w2,,...,wn的物品,可否從n件物品中挑選若干件剛好裝滿揹包,要求找出全部知足上述條件的解。spa
當C=10,各件物品重量爲{1,8,4,3,5,2}時,能夠找到下列4組解:(1,4,3,2)、(1,4,5)、(8,2)和(3,5,2)。設計
根據這個問題的一個變形是:blog
已知一個數爲C,一個長度爲n的無序的數組,分別是數w1,w2,...,wn,可否從這n個數中找到若干個數使其和等於數C,要求找出全部知足上述條件的解。程序設計
(2)經典的0-1揹包問題(有物品的價值):程序
給定n種物品和一個揹包。物品i的重量是wi,其價值爲vi,揹包的容量爲C。應該如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大?im
上面的兩個問題都是0-1揹包問題,由於隱含的信息是:對每種物品只有兩種選擇,即裝入揹包或者不裝入揹包。不能將物品裝入屢次,也不能只裝入部分的物品。數據
(3)揹包問題:與0-1揹包問題相似,所不一樣的是在選擇物品i裝入揹包時,能夠選擇物品i的一部分,而不必定要所有裝入揹包。
2、解決思路
對於問題(1),本文采用的是回溯思想,利用棧的「後進先出」的特性,首先將物品排成一列,而後順序選取物品裝入揹包,假設已選取了前i件物品以後揹包還沒裝滿,
則繼續選取第i+1件物品,若選該件物品的重量太大不能裝入,則放棄而繼續選取下一件,直至揹包裝滿爲止。可是若是在剩餘物品中找不到合適的物品以填滿揹包,則說明
「剛剛」裝入揹包的那件物品「不合適」,應該將它取出,再繼續從它以後的物品中選取,如此重複,直至求得知足要求的解,或者無解爲止。由於回溯的規則也是「後進先出」,
因此採用棧這個數據結構。
對於問題(2),其實能夠採用問題(1)的解法,由於要使價值最大化,確定也是儘量多的往揹包裏裝物品。只是此時不要求裝滿揹包,而是在過程當中不斷比較每種狀況的
總價值,並找到總價值最大的選擇方式。
對於問題(3),這種揹包問題能夠用貪心算法求解,先計算每種物品單位重量的價值vi/wi;而後根據貪心策略,將可能多得單位重量價值最高的物品裝入揹包;依次使用這種
策略,直至裝滿揹包爲止。
3、程序設計
問題(1):
問題(2):
問題(3):