計算機(jī)等級考試C語言程序設(shè)計例解(05)

字號:

05. 從n個不同價值、不同重量的物品中選取一部分,在不超過限定的總重量的前提下,使該部分的價值。這里假定的總重量不超過n個物品的總重量總和,且沒有一樣物品的重量超過限定的總重量。
    解:
     這個問題是求解的典型例子。為找解,需生成所有可能的解。在生成這些解的同時,保留一個指定意義下的當(dāng)前解,當(dāng)發(fā)現(xiàn)一個更好的解時,就把這個解改為當(dāng)前解,并保留之。
     現(xiàn)給出一組n個物品中找出滿足約束條件的解的通例。為便于構(gòu)造算法,采用遞歸方法。構(gòu)成可接受解的所有選擇是通過依次考察組中的各個物品的結(jié)果,對每個物品的考察均有兩種可能:或所考察的物品被包括在當(dāng)前選擇中,或所考察的物品不被包括在當(dāng)前選擇中。遞歸函數(shù)是描述指定物品被包括或不被包括在當(dāng)前選擇中的計算過程,只要指定物品被包括后重量滿足約束條件,該物品被包括是應(yīng)該被考慮的;僅當(dāng)一個物品如不被包括也可能達(dá)到比當(dāng)前解所達(dá)到的總價值大時,為滿足重量的限制,不把該物品包含在當(dāng)前選擇中也是應(yīng)該被考慮的。為此,遞歸函數(shù)設(shè)有三個參數(shù):指定的物品、當(dāng)前選擇已達(dá)到的總重量和可能達(dá)到的總價值。下面的遞歸算法就是考察某個物品在當(dāng)前選擇中是否被包括的計算過程描述。
    算法---物品i在當(dāng)前選擇中被包括與否的遞歸算法
    try(物品i,當(dāng)前選擇已達(dá)到的總重量tw,可能達(dá)到的總價值tv)
    {
     /*考察當(dāng)前選擇包含物品i的合理性*/
     if(包含物品i是可接受的)
     {
     將物品i包括在當(dāng)前解中;
     if(i else
     調(diào)整當(dāng)前解;
     將物品i從當(dāng)前解中消去;
     }
     /*考察當(dāng)前選擇不包含物品i的合理性*/
     if(i else
     調(diào)整當(dāng)前解;
    }
    對當(dāng)前選擇而言,“包含物品i是可接受的”準(zhǔn)則是它被包括后,有可能達(dá)到的總價值也不小于當(dāng)前解所達(dá)到的價值,因為如果小于的話,繼續(xù)考察下去也不會產(chǎn)生更好的解。