c語言貪心演算法揹包問題 九章演算法 揹包問題

2021-10-17 08:28:01 字數 1078 閱讀 4731

在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為m,每個物品的大小為a[i]。

樣例 1:

輸入: [3,4,8,5], backpack size=10

輸出: 9

樣例 2:

輸入: [2,3,5,7], backpack size=12

輸出: 12

演算法:dp從已知的題目中,可以總結出以下兩點:

那麼考慮對於前i件的物品在容量為w的揹包下,最大的裝載量是多少,由此可以總結出對應的子結構,進行動態規劃。

演算法思路

設計dp陣列dp[n][m],用dp[i][j]表示第i個物品在容量為j的揹包下,最大的裝載量。

在這個問題中,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只牽扯前i−1件物品的問題:

總結狀態轉義方程為:dp[i][j]=max(dp[i−1][j],dp[i−1][j−a[i]]+a[i])

複雜度分析

n表示物品件數,m表示揹包容量

演算法優化觀察上方的狀態轉義方程,可以發現dp[i][j]方程的兩個狀態都只和dp[i-1]有關,顯然通過o(nm)的空間複雜度,難免會浪費一些空間。

可以考慮使用滾動陣列優化,建立dp陣列dp[m],使用dp[j-a[i]]代替dp[i-1][j-a[i]]。優化後狀態轉義方程為dp[j]=max(dp[j],dp[j−a[i]]+a[i])

優化後複雜度分析

時間複雜度:o(nm)

空間複雜度:o(m)

**思路分析

public class solution 

int n = a.length;

int dp = new int[m + 1];

for (int i = 0; i < n; i++)

}return dp[m];}}

演算法 貪心演算法(揹包問題)

給定n 個物品和乙個容量為 c的揹包,物品 i的重量是 wi,其價值為 vi,揹包問題是如何選擇入揹包的物品,使得裝入揹包的物品的總價值最大,注意和 0 1揹包的區別,在揹包問題中可以將物品的一部分裝入揹包,但不能重複裝入。用貪心法求解揹包問題的關鍵是如何選定貪心策略,使得按照一定的順序選擇每個物品...

揹包問題(貪心演算法)

揹包問題 程式8 4 2.cpp 定義控制台應用程式的入口點。揹包問題 貪心演算法 include stdafx.h define maxnumber 20 typedef struct node object float find object wp,int n,float m i 0 while...

貪心演算法 揹包問題

詳細見原帖 我寫的是自己的感悟 揹包問題 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 ...