关于动态规划01背包问题的一些心得体会
生活随笔
收集整理的這篇文章主要介紹了
关于动态规划01背包问题的一些心得体会
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
《算法筆記》動(dòng)態(tài)規(guī)劃之01背包問(wèn)題狀態(tài)轉(zhuǎn)移方程的代碼為:
for(int i = 1; i <= n; i++){ //n件物品for(int j = w[i]; j <= c; j++){ //每件物品的重量為w[i], 價(jià)值為v[i], 背包最大容量為cdp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i];} }搜索CSDN大佬博客得出的代碼為:
for(int i = 1; i <= n; i++){for(int j = 1; j <= c; j++){if(j < w[i]){ //如果當(dāng)前背包容量不足以裝下第i件物品dp[i][j] = dp[i-1][j]; //只能選擇不裝}else{ //如果當(dāng)前背包容量足以裝下第i件物品//但由于裝第i件物品不一定使得價(jià)值最大,所以考慮裝與不裝第i件物品所能得到的最大價(jià)值dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);}}}個(gè)人更傾向于第二種代碼,對(duì)于第一種代碼的正確性存在疑問(wèn)。
原因是第一種代碼的內(nèi)層循環(huán),j從w[i]開(kāi)始取值,這樣在填表dp[i][j]的時(shí)候會(huì)漏填部分表格導(dǎo)致中間部分dp[i][j]的結(jié)果錯(cuò)誤。
舉個(gè)例子,假設(shè)現(xiàn)在有6件商品,背包容量最大為12
商品的重量為:w[i] = {4, 6, 2, 2, 5, 1}
商品的價(jià)值為:v[i] = {8, 10, 6, 3, 7, 2}
分別用兩種代碼填寫(xiě)dp數(shù)組,打印兩個(gè)表格。
兩種方法打印出來(lái)的數(shù)組分別如下:
第一種:
第二種:
可以看到,雖然兩種方法最優(yōu)解都是24,但中間部分dp[i][j]有了很大的出入。第二種的dp數(shù)組才是正確的。
總結(jié)
以上是生活随笔為你收集整理的关于动态规划01背包问题的一些心得体会的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何修改图片的分辨率和大小?在线图片编辑
- 下一篇: mathtype输入空格