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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法随笔一(背包问题)

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

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

何為背包問題?

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

如何解決背包問題?

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

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

總結

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

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