01揹包問題 C 解法

2021-09-25 09:02:13 字數 1066 閱讀 7500

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 的東西,問題來了,他怎麼樣偷才能拿到總...