經典揹包問題之動態規劃演算法解決方案

2021-10-09 18:51:32 字數 1292 閱讀 7124

給乙個容量為10的的揹包,物品有,分別對應的價值是,要如何組合才能使他們裝下的物品價值最大。一般這種經典問題有兩種要求,第一種是每個物品可以復用,這也叫完全揹包演算法。**如下

int wanquanbeibao(vector& weihts, vector& values, int sum)

} return (dp[sum] == 0) ? -1 : dp[sum];

}

這種思路就是從1開始迴圈,一直到sum,從1,取最大價值,2時也取最大價值...每乙個子問題都是最優的,那麼加起來的結果一定是最優的,但並不唯一,可以存在多種解。

第二種要求是,每個物品只能用一次,那麼就是非完全揹包問題,演算法如下

//01揹包演算法問題(乙個物品只能用一次)

int onlyonebeibao(vector& weihts, vector& values, int sum)

else

} }return dp[weihts.size()][sum];

}

這個理解起來就要費勁一些,他的思路是用乙個二維陣列去記錄,思路是和前面的例子一樣的,順著**思路走,dp[i][w]=前i個物品在容積為w時他的最大價值,這樣的設計,他就避免了物品會被重複利用。需要好好體會這兩段**,你才能明白他們之間的區別。

完整執行**

#include #include #include #include using namespace  std;

//完全揹包演算法(物品可以多次復用)

int wanquanbeibao(vector& weihts, vector& values, int sum)

} return (dp[sum] == 0) ? -1 : dp[sum];

}//01揹包演算法問題(乙個物品只能用一次)

int onlyonebeibao(vector& weihts, vector& values, int sum)

else

} }return dp[weihts.size()][sum];

}int _tmain(int argc, _tchar* ar**)

; vectorvalues;

cout << wanquanbeibao(weihts, values, 10) << endl;

cout << onlyonebeibao(weihts, values, 10) << endl;

system("pause");

return 0;

}

0 1揹包問題 動態規劃 演算法入門經典

以前一直不想學關於動態規劃類的問題,但是想了想,還是要學的,再次去看的時候,發現比之前要好一些,演算法入門經典 裡邊講的動態規劃入門理解著可能會簡單一些,但是如果想深入理解這種方法,還學要多看一些資料,多做一些題目吧。暴力求解 回溯 剪枝 動態規劃,逐步減少對於問題的搜尋力度,減少不必要的搜尋,達到...

動態規劃演算法之0 1揹包問題

我們首先來看一下問題 乙個旅行者有乙個容量為c的揹包,現在有n種物品,每件的重量分別是w1 w 2 w n,每件物品的價值分別為v1 v 2 v n,需要將物品放入揹包中,要怎麼樣放才能保證揹包中物品的總價值最大?具體資料如下表,其中n 4,c 8。前面已經對動態規劃的基本概念做了詳細的講解,動態規...

01揹包問題 (動態規劃演算法)

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波 面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...