Swift-背包問題

背包問題常見的有兩種刘陶,01背包問題和完全背包問題后裸,實現(xiàn)起來比較簡單,論證過程需要一定的數(shù)學推理知識骏啰,本文給出基本實現(xiàn)過程离斩,關(guān)于推理可以看一下網(wǎng)上的文章.

01背包問題

一個背包總?cè)萘繛閂银舱,現(xiàn)在有N個物品,第i個 物品體積為weight[i]跛梗,價值為value[i]寻馏,現(xiàn)在往背包里面裝東西,怎么裝能使背包的內(nèi)物品價值最大茄袖?每件物品只能選擇取或不取.


bag.jpg

核心實現(xiàn)代碼:
<pre><code>` init(maxW:Int,value:[Int],weight:[Int]) {
maxWeight = maxW
values = value
weights = weight
let temp:[Int] = [Int].init(repeating: 0, count: maxWeight + 1)
calculate = [[Int]].init(repeating: temp, count: values.count)
}

func solveMaxValue()->Int {
    
    for i in 1..<values.count { // 注意起始位置
        for j in 1...maxWeight {
            if weights[i] <= j {
                calculate[i][j] = maxCompare(a: values[i] + calculate[i - 1][j - weights[i]], b: calculate[i-1][j])
            } else {
                calculate[i][j] = calculate[i - 1][j]
            }
        }
    }
    return calculate[values.count - 1][maxWeight]
}`</code></pre>

可以優(yōu)化為一維數(shù)組:
<pre><code>` func solveMaxValue2()->Int {
calculate2 = [Int].init(repeating: 0, count: maxWeight + 1)

    for i in 1..<values.count {
        for j in (1...maxWeight).reversed() {
            if weights[i] <= j {
                calculate2[j] = maxCompare(a:  calculate2[j], b:  (calculate2[j-weights[i]]+values[i]))
            }
        }
    }
    return calculate2[maxWeight]
}`</code></pre>

完全背包問題

一個背包總?cè)萘繛閂操软,現(xiàn)在有N個物品,第i個 物品體積為weight[i]宪祥,價值為value[i]聂薪,每個物品都有無限多件家乘,現(xiàn)在往背包里面裝東西,怎么裝能使背包的內(nèi)物品價值最大藏澳?
將01背包的第二種解法稍微調(diào)整即可:
<pre><code>` func solveMaxValue3()->Int {
calculate3 = [Int].init(repeating: 0, count: maxWeight + 1)

    for i in 1..<values.count {
        for j in 1...maxWeight {
            if weights[i] <= j {
                calculate3[j] = maxCompare(a:  calculate3[j], b:  (calculate3[j-weights[i]]+values[i]))
            }
        }
    }
    return calculate3[maxWeight]
}`</code></pre>

測試代碼:
<pre><code>`var values:[Int] = [0, 60, 100, 120] //為了理解第0個設(shè)置為0

var weights:[Int] = [0, 10, 20, 30]

values = [0,6,3,5,4,6]

weights = [0,2,2,6,5,4]

var max:Int = 10

var bag:Bag = Bag.init(maxW: max, value: values , weight: weights)

var maxValue = bag.solveMaxValue()

print("FlyElephant---01背包最大的值----(maxValue)")

var maxValue2 = bag.solveMaxValue2()
print("Fylephant---01背包最大值為---(maxValue2)")

var maxValue3 = bag.solveMaxValue3()
print("FlyElephant---完全背包最大值為---(maxValue3)")`</code></pre>
輸出結(jié)果:


FlyElephant.png

參考資料
[0-1背包問題和部分背包(fractional knapsack)問題分析](http://shmilyaw-hotmail-com.iteye.com/blog/2009761](http://shmilyaw-hotmail-com.iteye.com/blog/2009761)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仁锯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翔悠,更是在濱河造成了極大的恐慌业崖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓄愁,死亡現(xiàn)場離奇詭異双炕,居然都是意外死亡,警方通過查閱死者的電腦和手機撮抓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門妇斤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丹拯,你說我怎么就攤上這事站超。” “怎么了乖酬?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵死相,是天一觀的道長。 經(jīng)常有香客問我咬像,道長算撮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任县昂,我火速辦了婚禮钮惠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘七芭。我一直安慰自己,他們只是感情好蔑赘,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布狸驳。 她就那樣靜靜地躺著,像睡著了一般缩赛。 火紅的嫁衣襯著肌膚如雪耙箍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天酥馍,我揣著相機與錄音辩昆,去河邊找鬼。 笑死旨袒,一個胖子當著我的面吹牛汁针,可吹牛的內(nèi)容都是我干的术辐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼施无,長吁一口氣:“原來是場噩夢啊……” “哼辉词!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猾骡,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瑞躺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兴想,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幢哨,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年嫂便,在試婚紗的時候發(fā)現(xiàn)自己被綠了捞镰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡顽悼,死狀恐怖曼振,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔚龙,我是刑警寧澤冰评,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站木羹,受9級特大地震影響甲雅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坑填,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一抛人、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脐瑰,春花似錦妖枚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寂恬,卻和暖如春续誉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背初肉。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工酷鸦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓臼隔,卻偏偏與公主長得像嘹裂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躬翁,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容