給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問:應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?
用dp[i][j]表示當前揹包放進i件物品後剩餘容量為j對應的最大價值。當考慮第i件物品時,有裝與不裝兩個選擇。
首先如果當前剩下的容量小於i的重量(j如果當前剩下的容量大於i的重量(j>wi),還能裝得下,應該根據能得到的價值決定裝與不裝,如果裝,那麼價值為dp[i-1][j-wi]+vi,如果不裝,那麼價值為dp[i-1][j],所以此時的最大價值dp[i][j]=max(dp[i-1][j], dp[i-1][j-wi]+vi)。
注意:開的陣列是n+1*c+1的,因為要儲存初始值,即j=0和i=0的值,初始化時,dp[i][0]=0,因為沒有容量時最大價值都是0。
**如下:這種思路的時間和空間複雜度都是o(n*c),可以回溯找到最優解的組成。
int findmax(int n, int c)
}return dp[c];
}
動態規劃之01揹包問題
首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...
動態規劃之0 1揹包問題
問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...
動態規劃之0 1揹包問題
問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...