日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

背包问题九讲_背包问题

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 背包问题九讲_背包问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背包問題九講

我發現背包問題既棘手又有趣。 我敢肯定,如果您正在訪問此頁面,您已經知道了問題說明,但是只是為了完成本章:

問題:

給定一個最大容量為W和N的背包,每個背包都有自己的值和重量,將它們放入背包中,使最終內容物具有最大值。 kes!



  • 鏈接到Wiki中的問題頁面

這是解釋問題的一般方法-考慮一個小偷進入家中搶劫,他背著背包。 家里有固定數量的物品-每個物品都有自己的重量和價值-珠寶首飾,重量和重量比桌子高,價值少,但重量重。 為了給火上加油,小偷有一個老式的背包,容量有限。 顯然,他不能將桌子分成兩半,也不能將珠寶分成3/4分。 他要么接受要么離開。

范例:

Knapsack Max weight : W = 10 (units)Total items : N = 4Values of items : v[] = {10, 40, 30, 50}Weight of items : w[] = {5, 4, 6, 3}

粗略看一下示例數據可知,在最大權重為10的情況下,我們可以容納的最大值為50 + 40 = 90(權重為7)。

方法:

最佳解決方法是使用動態編程-解決較小的背包問題,然后將其擴展為較大的問題。

讓我們構建一個名為V(值數組)的Item x權重數組:

V[N][W] = 4 rows * 10 columns

此矩陣中的每個值代表一個較小的背包問題。

基本案例1 :讓我們以第0列為例。 這僅意味著背包的容量為0。 你能在他們身上抱什么? 沒有。 因此,讓我們用0填充它們。

基本情況2 :讓我們以0行為例。 這僅表示房子中沒有物品。 如果沒有物品,您在背包里會做什么? 沒事了! 全零。

解:

  • 現在,讓我們開始逐行填充數組。 第1行和第1列是什么意思? 給定第一個項目(行),您能否將其容納在容量為1(列)的背包中。 不。 第一項的權重為5。因此,讓我們填寫0。實際上,直到到達第5列(權重5),我們才能填寫任何內容。
  • 一旦我們到達第一行的第5列(代表權重5),這意味著我們可以容納第1項。讓我們在此處填寫10(請記住,這是一個Value數組):


  • 繼續,對于權重6(第6列),我們是否可以容納剩余重量為1(重量–該項目的重量=> 6 – 5)的任何其他東西。 嘿,記住,我們在第一個項目上。 因此,從直覺上講,該行的其余部分也將是相同的值,因為我們無法為已獲得的額外重量添加任何其他項目。


  • 因此,當我們到達第三行的第4列時,會發生下一個有趣的事情。 當前的跑步重量為4。
  • 我們應檢查以下情況。

  • 我們可以容納項目2 –是的,我們可以。 項目2的權重為4。
  • 如果沒有第2項,當前重量的值是否會更高? –檢查上一行是否具有相同的重量。 不。 前一行*的內容為0,因為我們無法容納重量為4的商品1。
  • 我們是否可以容納兩個重量相同的物品,以使價值最大化? - 不。 減去Item2的權重后的剩余權重為0。
  • 為什么要上一行?

    僅僅是因為權重為4的前一行本身是一個較小的背包解決方案,它給出了該權重在該點之前可以累積的最大值(遍歷所有項目)。

    舉例來說,

  • 當前項目的值= 40
  • 當前商品的重量= 4
  • 剩下的權重= 4 – 4 = 0
  • 檢查上面的行(如果是項目1,則檢查上面的項目;如果其余的行,則檢查累積最大值)。 對于剩余重量0,我們是否可以容納項目1? 簡而言之,對于給定的重量,上一行是否有任何值?
  • 計算如下:

  • 不帶此項,取相同重量的最大值: previous row, same weight = 0=> V[item-1][weight]
  • 取當前商品的價值+我們可以用剩余重量容納的價值: Value of current item + value in previous row with weight 4 (total weight until now (4) - weight of the current item (4))=> val[item-1] + V[item-1][weight-wt[item-1]]

    兩者之間的最大值為40(0和40)。

  • 下一個也是最重要的事件發生在第9列和第2行。這意味著我們的權重為9,并且有兩項。 查看示例數據,我們可以容納前兩個項目。 在這里,我們考慮幾件事: 1. The value of the current item = 40 2. The weight of the current item = 4 3. The weight that is left over = 9 - 4 = 5 4. Check the row above. At the remaining weight 5, are we able to accommodate Item 1.


  • 因此,計算公式為:

  • 不帶此項,取相同重量的最大值: previous row, same weight = 10
  • 取當前商品的價值+我們可以用剩余重量累計的價值: Value of current item (40) + value in previous row with weight 5 (total weight until now (9) - weight of the current item (4)) = 10

    10比50 = 50。

  • 解決所有這些較小的問題后,我們只需要返回權重為10的V [N] [W] –項目4的值:

    復雜

    分析解決方案的復雜性非常簡單。 我們只是在N => O(NW)的循環中有一個W循環

    實現方式:

    這是Java中的強制性實現代碼:

    class Knapsack {public static void main(String[] args) throws Exception {int val[] = {10, 40, 30, 50};int wt[] = {5, 4, 6, 3};int W = 10;System.out.println(knapsack(val, wt, W));}public static int knapsack(int val[], int wt[], int W) {//Get the total number of items. //Could be wt.length or val.length. Doesn't matterint N = wt.length; //Create a matrix. //Items are in rows and weight at in columns +1 on each sideint[][] V = new int[N + 1][W + 1]; //What if the knapsack's capacity is 0 - Set//all columns at row 0 to be 0for (int col = 0; col <= W; col++) {V[0][col] = 0;}//What if there are no items at home. //Fill the first row with 0for (int row = 0; row <= N; row++) {V[row][0] = 0;}for (int item=1;item<=N;item++){//Let's fill the values row by rowfor (int weight=1;weight<=W;weight++){//Is the current items weight less//than or equal to running weightif (wt[item-1]<=weight){//Given a weight, check if the value of the current //item + value of the item that we could afford //with the remaining weight is greater than the value //without the current item itselfV[item][weight]=Math.max (val[item-1]+V[item-1][weight-wt[item-1]], V[item-1][weight]);}else { //If the current item's weight is more than the //running weight, just carry forward the value //without the current itemV[item][weight]=V[item-1][weight];}}}//Printing the matrixfor (int[] rows : V) {for (int col : rows) {System.out.format("%5d", col);}System.out.println();}return V[N][W];}}

    翻譯自: https://www.javacodegeeks.com/2014/07/the-knapsack-problem.html

    背包問題九講

    總結

    以上是生活随笔為你收集整理的背包问题九讲_背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。