VS 排序思考与实现——动态规划(四)

来源:互联网 发布:360域名放在中国 编辑:程序博客网 时间:2024/05/17 03:40

  动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划.百度百科
  在算法的学习中,动态规划的思想是其中尤为重要也具有一定难度的部分,它的灵活使用将会帮助我们解决很多复杂的大问题。在算法中动态规划解决的主要是多个连锁问题的选择,如:路线的规划,最优策略的组合等。
  在动态规划中,最为经典的习题就是0-1背包的问题,下面是我用C#实现的代码,用到了物品个数n,一维数组Weights记录每个物品的重量,Values数组记录每个物品的价值。最后使用一个二维数组C[i][w]以备忘的方式来记录当前状况下背包的最大价值。

namespace Knapsack_problem{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++) //显示物品价值{    label3 .Text += values[i]+ " ";} for (int i = 0; i <= Weights.Length - 1; i++) //显示物品重量{    label4.Text += Weights[i] + " ";}}private void button1_Click(object sender, EventArgs e) //计算背包最大价值{int i, w;int W = Convert.ToInt32(txtCapacity.Text); //获取背包容量int[] totval = 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]; //测试C4,10状况        }    }    else        c[i][w] = c[i - 1][w];        }    }label1.Text = "背包的最大价值: " + c[n][W];    }}}}

代码已经实际运行,若是有更好的优化想法欢迎大家留言,荣幸与您分享~

原创粉丝点击