算法随笔一(背包问题)
生活随笔
收集整理的這篇文章主要介紹了
算法随笔一(背包问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天逛園子,偶然看到了“背包問題”,于是上網找了下相關資料,并寫了個簡單的實現方案。
何為背包問題?
簡單理解,就是給了一堆物品跟一個包,每個物品都有相應的重量和價值,包有自己的承重。我們要做的就是在包的承重范圍內,往包里裝下價值總量最高的物品。
如何解決背包問題?
一般采用遞歸的方法,對每次放入物品進行數學建模。每次放入物品都會有兩種選擇(前提是該物品能放入):
1. 放入該物品,那么問題轉換成,減去該物品的重量,包剩余的容量最多能裝下多少價值的物品。
2. 不放入該物品,那么問題轉換成,算上該物品的重量,包的容量最多能裝下多少價值的物品
為了方便理解,可以參考以下表格(首行為包的容量):
| 重量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 價值 |
| 2 | 0 | 0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| 5 | 0 | 0 | 5 | 5 | 5 | 6 | 6 | 11 | 11 | 11 | 11 | 6 |
| 3 | 0 | 0 | 5 | 5 | 6 | 6 | 6 | 11 | 11 | 11 | 12 | 1 |
| 7 | 0 | 0 | 5 | 5 | 6 | 6 | 6 | 16 | 16 | 21 | 21 | 16 |
| 8 | 0 | 0 | 5 | 5 | 6 | 6 | 6 | 16 | 16 | 21 | 21 | 10 |
?
?
?
?
?
拿數據部分,第四行第八列的數據來說
如果放入物品三,則最高價值為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
總結
以上是生活随笔為你收集整理的算法随笔一(背包问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5折交叉验证_数据集的划分——交叉验证法
- 下一篇: C语言指针详解(超级详细)