日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

算法随笔一(背包问题)

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

今天逛園子,偶然看到了“背包問題”,于是上網找了下相關資料,并寫了個簡單的實現方案。

何為背包問題?

簡單理解,就是給了一堆物品跟一個包,每個物品都有相應的重量和價值,包有自己的承重。我們要做的就是在包的承重范圍內,往包里裝下價值總量最高的物品。

如何解決背包問題?

一般采用遞歸的方法,對每次放入物品進行數學建模。每次放入物品都會有兩種選擇(前提是該物品能放入):

1. 放入該物品,那么問題轉換成,減去該物品的重量,包剩余的容量最多能裝下多少價值的物品。

2. 不放入該物品,那么問題轉換成,算上該物品的重量,包的容量最多能裝下多少價值的物品

為了方便理解,可以參考以下表格(首行為包的容量):

重量012345678910價值
2005555555555
50055566111111116
30055666111111121
700556661616212116
800556661616212110

?

?

?

?

?

拿數據部分,第四行第八列的數據來說

如果放入物品三,則最高價值為1(物品三價值)+5(承重為4時的最高價值)=6。

如果不放入物品三,則最高價值為11(承重為7時放入前面物品的最高價值)

代碼如下:

物品類

public class BagItem {public int Weight { get; set; }public int Value { get; set; } }

背包類

public class Bag {private List<BagItem> _items;private int _capacity;public Bag(List<BagItem> items,int capacity){this._items = items;this._capacity = capacity;}public int CalculateMaxValue(){int n = _items.Count;int[,] array = new int[n + 1, _capacity + 1];for (int i = 0; i < n + 1; i++){array[i, 0] = 0;}for (int i = 0; i < _capacity + 1; i++){array[0, i] = 0;}for (int i = 1; i < n + 1; i++){for (int j = 1; j < _capacity + 1; j++){if (_items[i-1].Weight > j){array[i, j] = array[i - 1, j];}else{array[i, j] = Math.Max((_items[i-1].Value + array[i - 1, j-_items[i-1].Weight]), array[i - 1, j]);}}}return array[n, _capacity];} }

背包問題的實現就寫到這。

轉載于:https://www.cnblogs.com/alaskii/p/6142368.html

總結

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

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