題目要求:
編寫乙個程式exp5-2.cpp,求解揹包問題:設有不同價值、不同重量的物品n件,求從這n件物品中選取一部分物品的方案,使選中物品的總重量不超過指定的限制重量,但選中物品的總價值最大。
演算法分析:
1.演算法流程圖
2.演算法設計分析
該問題是求出n組組合中,在揹包容量允許的情況下,質量最大,且價值也最大的情況。列舉情況,排除不合理的組合,這裡選擇遞迴來實現。因此這裡設計兩組遞迴情況,一組是尋找最大質量的揹包,一組是尋找價值最大的揹包,兩組耦合則實現最優組合,揹包問題得到解決。在選擇方案的過程中需要一些標籤來標記物品是否已經被選擇,因此用cop[i]來標記,並將有效的資料傳給option[i],起到乙個橋梁的作用,而option[i]則是區別於未選擇的物品,起到「旗幟」的作用,最終達到可以用來輸出被選擇物品的函式的目的。
在揹包選擇的情況中有剛好達到揹包最大限度,求最大價值的;也有沒有達到揹包最大限度,但求幾種情況中最大價值的。因此揹包問題的細節設計也增加了積分難度。
3.演算法的狀態方程
用子問題定義狀態:即f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其
狀態轉移方程便是:
f[i][v]=max。
可以壓縮空間,f[v]=max
輸入**:
#includeint limitm;//限制的總重量
int totv;//全部物品的價值
int maxv;//方案的價值變數存貯值
int option[100];//方案的選擇,旗幟標誌已選擇的種類
int cop[100];//當前方案的選擇,橋梁作用
int n;//物品種數
總結:
查了好多資料,看了幾遍狀態轉移方程,參考了別人的**,終於完成了演算法設計。如果不用標記具體選擇哪種物品,可以直接套用狀態轉移方程設計的,但要考慮標記,一些細節的設計還沒學會,只能說,還沒完全學會吧!繼續加油
演算法設計 揹包問題
研究生課程系列文章參見索引 在信科的那些課 乙個旅行者準備隨身攜帶乙個揹包,可以放入揹包的物品有n種,每種物品的重量和價值分別為wj,vj 如果揹包的最大重量限制是b,怎樣選擇放入揹包的物品以使得揹包的價值最大?目標函式 約束條件 設fk y 表示只允許裝前k 種物品,揹包總重不超過y 時揹包的最大...
變種 揹包問題 演算法設計 揹包問題
題目 乙個旅行者準備隨身攜帶乙個揹包,可以放入揹包的物品有n種,每種物品的重量和價值分別為wj,vj 如果揹包的最大重量限制是b,怎樣選擇放入揹包的物品以使得揹包的價值最大?目標函式 約束條件 演算法設計 設fk y 表示只允許裝前k 種物品,揹包總重不超過y 時揹包的最大價值。fk y 有兩種情況...
(0 1)elasticsearch參考學習路徑
elk系列 一 安裝elasticsearch logstash kibana filebeat v7.7.0 elk系列 二 在kibana中使用restful操作es庫 elk系列 三 安裝logstash外掛程式及打包離線安裝包 elk系列 四 logstash讀取nginx日誌寫入es中 e...