1. 程式人生 > >【演算法】之動態規劃

【演算法】之動態規劃

含義

    動態規劃(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]; } } }

結果顯示

這裡寫圖片描述

總結

    這裡的程式碼有點像是之前在進行整理表格,將所有物品的價值填在了表格裡,只是選擇出了最優價值,但是沒有顯示具體是哪幾個物品,還有待大家完善。