深入淺出之揹包演算法 動態規劃是如何打敗遞迴的?

2021-08-26 21:05:08 字數 1448 閱讀 3023

揹包問題(knapsackproblem)是一種組合優化的

np完全問題

。問題可以描述為:給定一組物品,每種物品都有自己的重量和**,在限定的總重量內,我們如何選擇,才能使得物品的總**最高。

這個問題涉及到了兩個條件:一是物品總的大小小於或等於揹包的大小,二是物品總的價值要盡量大。

一.採用遞迴的回溯法

剛開始接觸此類問題時,很多人都會想到用回溯法解決,也就是用遞迴,這是最直接的方法,同八皇后、迷宮、組合、全排列、貪吃蛇等問題一樣,下面給我本人開始用遞迴寫出的演算法:

//採用遞迴解決揹包問題 #include "stdafx.h" #include #include #include #include using namespace std; class fruit string getname() int getprice() int getsize() }; #define bounce 10 //最大裝入數量 #define n 10 //水果的個數 fruit fruits=; vectorselectedcompose; //當前最優選擇序列 int maxprice; //當前最大總** void search(int begin, int sumsize, int sumprice, vectorv) v.pop_back();//將最後乙個元素刪除,以尋找下乙個可能的匹配 } if (s < bounce) } } int _tmain(int argc, _tchar* argv)

具體的解釋可以理解為

將前i件物品放入容量為v的揹包中,

現只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只

涉及前i-1件物品和第i

件物品的問題。

如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。(v

表示揹包的最大容量,

c[i]

表示第i

件物品的大小,

w[i]

表示第i

件物品的價值)

// knapsackproblem.cpp : 定義控制台應用程式的入口點。 // #include "stdafx.h" #include #include #include using namespace std; #define max 8 #define min 1 class fruit string getname() int getprice() int getsize() }; void main() ; for (int i = 0; i < max+1; i++) for(int i = 0; i < 7; i++) } } cout<<"物品\t**"

動態規劃之深入淺出

動態規劃 dynamic programming,dp 演算法目的為解決多階段決策最優化問題,採取的方法是將待求解的問題分解為多個子問題,按順序求解每乙個子問題,當前子問題的解將由前乙個子問題的解推導出,最後乙個子問題就是初始問題的解。由於動態規劃解決的問題多數有重疊子問題這個特點,為減少重複計算,...

Cocoa 深入淺出Cocoa 之動態建立類

在前文 深入淺出cocoa之類與物件 一文中,我已經詳細介紹了objc中的 class 與 object 的概念,今天我們來如何在執行 時動態建立類。下面這個函式就是應用前面講到的class,metaclass的概念,在執行時動態建立乙個類。這個函式來自 inside mac os x the ob...

Cocoa 深入淺出Cocoa 之動態建立類

深入淺出cocoa 之動態建立類 羅朝輝 本文遵循 署名 非商業用途 保持一致 創作公用協議 在前文 深入淺出cocoa之類與物件 一文中,我已經詳細介紹了objc中的 class 與 object 的概念,今天我們來如何在執行 時動態建立類。下面這個函式就是應用前面講到的class,metacla...