数据结构&算法-动态规划
Posted 彩色墨水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构&算法-动态规划相关的知识,希望对你有一定的参考价值。
概念
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
问题的最优解如果可以由子问题的最优解推导得到,则可以先求解子问题的最优解,在构造原问题的最优解;若子问题有较多的重复出现,则可以自底向上从最终子问题向原问题逐步求解。
运行结果
代码
using System;
namespace DynamicProgramming
{
class Program
{
static void Main(string[] args)
{
DynamicProg dynamicProg = new DynamicProg();
int minnum = -1;
int[,] cominfo = dynamicProg.MinCom(new int[3] { 2, 5, 7 }, 50, ref minnum);
for (int i = cominfo.GetLength(0) - 1; i > 0 && i != int.MaxValue; i = cominfo[i, 1])
{
Console.WriteLine(cominfo[i, 0]);
}
Console.WriteLine("最小使用数量:" + minnum);
Console.ReadKey();
}
}
class DynamicProg
{
//有三种砝码,重量分别是2g,5g,和7g,每种砝码都足够多,称一个重27g的物体,如何用最少的砝码组合正好称得27g。
public int[,] MinCom(int[] grop, int total, ref int minnum)
{
int[,] indexs = new int[total + 1, 2];//用于存储 每种重量下,最小组合时, 最后一枚的重量以及前面的重量。
int[] f = new int[total + 1]; //初始化 组合出index额度的,最小数量.
f[0] = 0;//关键初始化界限,组合额度为0的情况,所需的数量也为0.
indexs[0, 1] = int.MaxValue;
indexs[0, 0] = int.MaxValue;
for (int i = 1; i <= total; i++) //额度从1 - total。
{
f[i] = int.MaxValue;//起初所需的数量都是无穷大
indexs[i, 0] = int.MaxValue;
indexs[i, 1] = int.MaxValue;
for (int j = 0; j < grop.Length; j++)
{
if (i - grop[j] >= 0 && f[i - grop[j]] != int.MaxValue)
{
if (f[i] > f[i - grop[j]] + 1)
{
indexs[i, 0] = grop[j];//存储最后一枚的重量
indexs[i, 1] = i - grop[j];//存储该总重的情况下,前置重量情况
}
f[i] = Math.Min(f[i], f[i - grop[j]] + 1); //存储最小枚数
}
}
}
if (f[total] == int.MaxValue)
{
minnum = -1;
}
else
{
minnum = f[total];
}
return indexs;
}
}
}
以上是关于数据结构&算法-动态规划的主要内容,如果未能解决你的问题,请参考以下文章
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 15 背包问题