給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.
從這個問題中是給定了乙個容量沒m的揹包,和n個重量為w和價值為v的物品,我要用這n個物品是填充揹包使,填充的價值最大。這裡每個物品都有兩種狀態,放進揹包和不放入揹包。
對於這個問題這裡將使用動態規劃去做。動態規劃的重點也就是找出遞推公式。假設我們給出n = 3 , m= 5 ,三個物品的重量和價值分別為:
物品重量價值a
23b3
5c47
我們這裡可以假設只有乙個物品a那麼我們要裝滿揹包的最大價值就是3 。若果有兩個物品a,b那麼就會有(a,b) ,a , b這三個可能情況,細心觀察前面三種情況我們可以把它分為兩類即 :包含b和不包含b 。若果我們再把揹包的容量j考慮進來就是 :當揹包容量為j時揹包中包含b的價值和當揹包容量為j時揹包中包含b的價值。依次類推可以得到同樣的結論。由此我們可以定義乙個陣列dp[i][j] .dp[i][j]表示揹包容量為j並且有i件物品時的最大價值。那麼最大價值就是從這兩個裡面取最大值,即dp[i][j] = max(dp[i-1][j] , dp[i][j -w[i]] +v[i]) .這樣我們就有了遞推公式。
**如下:
#include
#include
using namespace std ;
intmain()
} cout << dp1[n]
[m]
}
對於上面的**我們分析可以得到程式的 ,時間複雜度為o(nm) ,空間複雜度為o(nm) ,在這裡時間複雜度我們不能再優化了,但是對於空間複雜度我們可以在進行優化。
在這裡我們可以使用乙個一維陣列去代替二維陣列dp,但是我們發現上面的**dp1[i][j] = dp1[i-1][j] >dp1[i-1][j-w[i]]+v[i] ? dp1[i-1][j] : dp1[i-1][j-w[i]] +v[i] ;
中使用陣列中前面的值來更新後面的值,因此要解決這個問題我們可以讓第二個for迴圈逆序遍歷這樣,當我們求解後面的值時,前面的值還沒有被替換掉。**如下:
#include
#include
using namespace std ;
intmain()
}//總的執行次數為 n+3*n*m ,時間複雜度為o(n*m) ,空間複雜度為o(m) 空間複雜度降低了
cout << dp1[m]
}
進過優化後程式的 時間複雜度為o(n*m) ,空間複雜度為o(m) 空間複雜度降低了。
完全揹包問題和0-1揹包問題相似,區別在於完全揹包問題他的每件物品的數量是無限的我們可以無限取。
對於這個問題我們可以從0-1揹包入手,可以看到區別在於每種物品可以無限取,但是實際上每種物品能取得數量是有限的那就是,揹包的總容量/每個物品的質量 ,即m/w[i] .那麼也就是說每種物品有m/w[i]+1種取法 即 0 , 1 ,2 ,3… m/w[i] 。就直接的方法就是在0-1揹包中加乙個for迴圈去遍歷看看第i個物品放幾個 。**如下
#include
#include
using namespace std ;
intmax
(int a ,
int b)
intmain()
}//總的執行次數為 n+3*n*m ,時間複雜度為o(n^3) ,空間複雜度為o(n*m)
cout << dp1[n]
[m]
}
執行上面的**我們是可以得到最優解的,但是我們仔細分析**可以發現,這個**的時間複雜度為o(n^3) ,空間複雜度為o(n^2)。這裡我們可以考慮和0-1揹包一樣可以進行空間複雜度的優化。對於時間複雜度的優化可以是有i件物品時,容量為j的揹包所能達到的最大價值中,包含i的件數可能為0,1……k*w[i] #include
#include
using namespace std ;
intmax
(int a ,
int b)
intmain()
} cout << dp1[m]
}進過上面的優化我們可以看到,程式的時間複雜度為o(n^2) ,空間複雜度為o(n)。 賣方 這件商品14元 買方 給你20元 賣方 不好意思,我的零錢不夠 買方 好吧,這是15元,剩的當小費 當到乙個地方旅遊時,如果你買東西的地方不支援信用,帶零錢還是非常有用的。特別是有時候賣方沒有零錢,如果你沒有剛好的錢,你需要支付比賣價多一點。當然你想付盡量少的錢 至少是商品價值的錢 並且,當支... 最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。然而文章給了許多案例分析,卻沒有很好的練習。說明 1 本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。... 一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...揹包問題 動態規劃 C C
動態規劃之揹包問題
動態規劃之揹包問題