【演算法】之動態規劃
阿新 • • 發佈:2018-11-17
含義
動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。
分類
動態規劃一般可分為線性動規,區域動規,樹形動規,揹包動規四類。那麼今天我們主要來看一下揹包動態規劃問題。
- 01揹包問題
- 完全揹包問題
- 分組揹包問題
- 二維揹包
- 裝箱問題
- 擠牛奶
適用條件
- 最優子結構性質
- 重疊子問題
問題背景
今天我們來主要看一下揹包動態規劃問題中的0-1揹包問題,背景如下:有5個待選物品,重量分別為3,4,7,8,9;價值分別為4,5,10,11,13;
現在就來具體看看一下程式碼吧!
namespace Knapsack
{
public partial class Form1 : Form //0/1揹包問題
{
int[] Weights = new int[] { 3,4, 7, 8, 9 }; //設定物品重量
int[] values = new int[] { 4, 5, 10, 11, 13 }; //設定物品價值
//設定備忘錄
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) //初始化
{
for (int i = 0; i <= values.Length - 1; i++) //顯示物品價值
{
label1.Text += values[i] + "";
}
for (int i = 0; i <= Weights.Length - 1; i++) //顯示物品重量
{
label2.Text += Weights[i] + "" ;
}
}
private void button1_Click(object sender, EventArgs e) //計算揹包最大價值
{
int i, w;
int W = Convert.ToInt32(txtCapacity.Text); //獲取揹包容量
int[] vtotal = new int[W + 1]; //存貯最大的總價值
int[] best = new int[W + 1]; //存貯當前價值最高的物品
int n = values.Length; //設定物品個數
int[][] c = new int[n + 1][]; //初始化二維陣列
for (i = 0; i <= n; i++)
{
c[i] = new int[W + 1];
}
for (w = 0; w <= W; w++)
{
c[0][w] = 0;
}
for (i = 1; i <= n; i++)
{
c[i][0] = 0;
for (w = 1; w <= W; w++)
{
if (Weights[i - 1] <= w)
{
if (values[i - 1] + c[i - 1][w - Weights[i - 1]] > c[i - 1][w])
{
c[i][w] = values[i - 1] + c[i - 1][w - Weights[i - 1]];
}
else
{
c[i][w] = c[i - 1][w];
}
}
else
{
c[i][w] = c[i - 1][w];
}
}
}
label3.Text = "揹包的最大價值:" + c[n][W];
}
}
}
結果顯示
總結
這裡的程式碼有點像是之前在進行整理表格,將所有物品的價值填在了表格裡,只是選擇出了最優價值,但是沒有顯示具體是哪幾個物品,還有待大家完善。