01揹包問題
假設現有容量m的揹包,有i個物品,重量分別為w[1],w[2]…w[i],價值分別為p[1],p[2]…p[i],將哪些物品放入揹包可以使得揹包的總價值最大?最大價值是多少?
(示例1:m=10,i=3,物品重量-價值:3-4 , 4-5 , 5-6)
第一種 不帶備忘的自頂向下法
using system;
namespace csharp
;//物品重量
int p = ;//物品價值
console.writeline(updown(10, 3, w, p));//容量10,物品3
console.readkey();
}public static int updown(int m, int i, int w, int p)}}
}
思路:對於最大價值,有四種情況:
1.當i或m為0時,此時揹包容量為0或者物品個數為0,直接返回0。
2.當最後乙個物品的重量超出容量,捨棄不用。返回i-1時的情況。
3.當最後乙個物品的重量小於容量,可以裝下但不放入時(小於最大價值),直接返回i-1時的情況。
4.當最後乙個物品的重量小於容量,可以裝下且放入時,記錄此時價值並和之前作比較,返回較大的那乙個。
遞迴解法,時空複雜度極高,效率低下。
第二種 動態規劃
using system;
namespace csharp
;//物品重量
int p = ;//物品價值
console.writeline(bottomup(10, 3, w, p));//容量10,物品3
console.readkey();
}public static int bottomup(int m, int i, int w, int p)}}
return result[m, i];}}
}
思路:和前乙個思路大致相同,唯一不同的是用乙個陣列來承接每次放入物品的價值,之後再次呼叫則不需要重新計算,直接取陣列中的值即可。 0 1揹包問題(一維陣列解法)
0 1揹包問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題的特點是 每種物品只有一件,可以選擇放或者不放。演算法基本思想 利用動態規劃思想 子問題為 f i v 表示前i件物品恰放入乙個...
01揹包問題的動態規劃解法
參考 問題描述 給定n中物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問...
通俗理解0 1揹包問題解法
0 1揹包問題是乙個很經典的問題,使用動態規劃演算法來求解也是很經典的。下面我用乙個例子來講解用動態規劃演算法求解0 1揹包問題。假設商店中有5件東西,重量用w表示,用v表示 現在有乙個小偷來到了小店中,這哥們帶了乙個袋子,但是這個袋子只能裝20公斤 w 20 的東西,問題來了,他怎麼樣偷才能拿到總...