国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

背包問題學習筆記

xiao7cn / 2416人閱讀

摘要:狀態轉移方程背包問題的狀態轉移方程是其中即表示前件物品恰放入一個容量為的背包可以獲得的最大價值。求解將哪些物品裝入背包可使這些物品的體積總和不超過背包容量,且價值總和最大。

01背包 01背包的概念

有N件物品和一個容量為V的背包。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入背包可使價值總和最大。
從這個題目中可以看出,01背包的特點就是:每種物品僅有一件,可以選擇放或不放。

狀態轉移方程

01背包問題的狀態轉移方程是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

其中,即fi表示前i件物品恰放入一個容量為v的背包可以獲得的最大價值。
上述方程右邊可以理解為兩種情況,取最優值.
情況一:第i件不放進去,這時所得價值為:fi-1;
情況二:第i件放進去,這時所得價值為:fi-1]+w[i];

情況二的意思是,如果第i件放進去,那么在容量V-c[i]里就要放進前i-1件物品.(引用自)

案例解析

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?


首先要明確這張表是至底向上,從左到右生成的.
只要你能通過找規律手工填寫出上面這張表就算理解了01背包的動態規劃算法。
為了敘述方便,用e2單元格表示e行2列的單元格,這個單元格的意義是用來表示只有物品e時,有個承重為2的背包,那么這個背包的最大價值是0,因為e物品的重量是4,背包裝不了
對于d2單元格,表示只有物品e,d時,承重為2的背包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個背包能裝的。(引用自)

編程實現
var n = 5; //物品數量,該參數可以自行設定
var v = 10; //背包體積,該參數可自行設定
var volumArray = [4, 3, 5, 2, 5];//物品體積組成的數組,該參數可自行設定
var valueArray = [9, 6, 1, 4, 1];//物品價值組成的數組,該參數可自行設定
var tempArray = [];

for (let a = 0; a < n; a++) {
    tempArray[a] = [];
    for (let b = 0; b < v; b++) {
        tempArray[a].push(0);
    }
}

for (let i = 0; i < n; i++) {
    for (let j = 0; j < v; j++) {
        tempArray[i][j] = i == 0 ? 0 : tempArray[i - 1][j];
        if (i > 0 && j >= volumArray[i - 1]) {
            tempArray[i][j] = tempArray[i][j] >= tempArray[i - 1][j - volumArray[i - 1]] + valueArray[i - 1] ? tempArray[i][j] : tempArray[i - 1][j - volumArray[i - 1]] + valueArray[i - 1];
        }
    }
}

console.log(tempArray[n - 1][v - 1]);
完全背包 完全背包的概念

有N種物品和一個容量為V的背包,每種物品都有無限件可用。
第i種物品的體積是c,價值是w。求解將哪些物品裝入背包可使這些物品的體積總和不超過背包容量,且價值總和最大。

狀態轉移方程

參考上述01背包的轉移方程,不難得出:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}

偽代碼實現如下:

for i=1...N
    for v=0...V
        for k=1...v/w[i]
            f[i][v] = max{f[i-1][v],f[i-1][v-k*w[i]]+k*c[i]};
案例解析

給你六種面額1,5,10,20,50,100元的紙幣,假設每種幣值的數量都足夠多,編寫程序求組成N元的不同組合個數.

function fn (all) {
    const arr = [1, 5, 10, 20, 50, 100],
        len = arr.length,
        res = [];
    for (let i = 0; i <= len; i++) {
        res[i] = [];
        res[i][0] = 1;
    }
    for (let j = 1; j <= all; j++) {
        res[0][j] = 0;
    }
    for (let i = 1; i <= len; i++) {
        for (let j = 1; j <= all; j++) {
            res[i][j] = 0;
            for (let k = 0; k <= j / arr[i - 1]; k++) {
                res[i][j] += res[i - 1][j - k * arr[i - 1]];
            }
        }
    }
    return res[len][all];
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84070.html

相關文章

  • 遺傳算法解背包問題(javascript實現)

    摘要:遺傳算法物競天擇,適者生存,遺傳算法就是借鑒生物體自然選擇和自然遺傳機制的隨機搜索算法。隨機生成的基因適應度的最大值隨機生成,適應度函數計算種群中所有對象的適應度及總和,并對超出的基因進行懲罰。 此為《算法的樂趣》讀書筆記,我用javascript(ES6)重新實現算法。 遺傳算法 物競天擇,適者生存,遺傳算法就是借鑒生物體自然選擇和自然遺傳機制的隨機搜索算法。算法的關鍵點有:基因的選...

    longshengwang 評論0 收藏0
  • 算法學習筆記一、時空復雜度

    摘要:動態規劃背包士兵路徑復雜度談算法一定要考慮復雜度時間復雜度和空間復雜度時間復雜度計算機基本操作的次數匯編指令的條數尋址跳轉空間復雜度所需占用的內存字節數兩者區別空間是可以返回利用的。 面試求職班一筆記 算法主要研究:時空復雜度 算法的特征: 有窮性, 確定性, 可行性, 可能沒有輸入,但一定有輸出 常用算法 窮舉法(eg:求N個數的全排列;8皇后問題) 減而治之(二分查找...

    wuyumin 評論0 收藏0
  • 數據結構與算法之精講「遞歸系列」

    摘要:終止條件遞推公式遞歸的分類通過做大量的題,根據遞歸解決不同的問題,引申出來的幾種解決和思考的方式。我們通過層與層之間的計算關系用遞推公式表達出來做計算,經過層層的遞歸,最終得到結果值。 showImg(https://segmentfault.com/img/remote/1460000019222330); 前言 幾個月之前就想寫這樣一篇文章分享給大家,由于自己有心而力不足,沒有把真...

    zhichangterry 評論0 收藏0
  • Python遺傳算法框架DEAP-Creating Types

    摘要:是一個遺傳算法框架,這里是它的簡介。最小化問題使用負值的的最大化問題用正值。略種群種群橫線個體。這個種群是直接使用和函數來初始化的。個體之間分布在網格中每個格子包含一個個體。調用將會返回一個種群,個體是使用兩個索引可獲得的。 DEAP是一個python遺傳算法框架,這里是它的簡介。DEAP documentation今天整理一下DEAP的概覽,大體了解一下它的流程。初學,不嚴謹,僅作為...

    Channe 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<