問題:有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?
/*
* dynamic programming : 0-1 package problem
*/#include #include #include using namespace std;
struct item
}; int packageproblem(vector&itemlist, int capacity, int itemnumber, vector&ans)
for(int i = 0; i < itemnumber+1; i++)
else if(j >= itemlist[i - 1].w)
} }for(int i = 0; i < itemnumber+1; i++)
delete map[i];
cout << endl;
} delete map;
return map[itemnumber][capacity];
}int main()
cout << packageproblem(itemlist, capacity, itemnumber, ans);
return 0;
}
通過動態規劃系列1和2的練習,總結出:動態規劃需要記錄的資料的陣列的維數和需要記錄的變數個數有關,如在斐波那契數列問題中,只需要乙個一維陣列記錄即可,因為只有乙個變數。而在01揹包問題中,需要乙個二維陣列記錄,這是因為除了當前考慮的物品i之外,還有揹包容量這一變數。因此在實現動態規劃演算法的過程中,通過狀態轉移方程中的變數個數即可確定需要申請的標記陣列的維數。 動態規劃(2) 01揹包
給定n種物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。把這個過程理...
動態規劃(2) 01揹包
給定n種物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。把這個過程理...
動態規劃 揹包問題(DP系列)
一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...