动态规划法是一种强有力的算法设计技术, 它被广泛用于求解组合最优化问题。这种技术采用自底向上的方式递推求值, 将待求解的问题分解成若干个子问题, 先求解子问题, 并把子问题的解存储起来以便以后用来计算所需要求的解。
为了设计一种动态规划算法, 需要推导出一个递推关系, 用较小实例的解的形式来表示背包问题的实例的解。 解决0- 1 背包问题的递推式如下:V[i,j]= max{V[i- 1,j],vi+V[i- 1,j- wi ]}如果j- wi ≥0 V[i- 1,j],如果j- wi< " 0
namespace BackPackAlgorithm
{
class Program
{
static void Main(string[] args)
{
int[] weight={2,1,3,2};
int[] value={12,10,20,15};
int maxWeight = 5;
DynamicProgram dynamicprogram = new DynamicProgram(weight, value, maxWeight);
dynamicprogram.initial();
Console.WriteLine(dynamicprogram.algorithm());
}
}
class DynamicProgram
{
private int[] weight;
private int[] value;
private int max;
private int[,] matrix;
public DynamicProgram(int[] _weight, int[] _value, int _max)
{
this.weight = _weight;
this.value = _value;
this.max = _max;
}
public void initial()
{
matrix=new int[weight.Length+1,max+1];
for(int i=0;i<=max;i++)
{
matrix[0,i]=0;
}
for(int i=0;i<weight.Length;i++)
{
matrix[i,0]=0;
}
}
public int algorithm()
{
for (int i = 0; i <= matrix.GetUpperBound(0); i++)
{
for (int j = 0; j <= matrix.GetUpperBound(1); j++)
{
if ((i > 0) && (j > 0))
{
if ((j- weight[i-1]) >= 0)
{
matrix[i,j]=major(matrix[i-1,j],value[i-1]+matrix[i-1,j-weight[i-1]]);
}
else
{
matrix[i,j]=matrix[i-1,j];
}
}
}
}
return matrix[matrix.GetUpperBound(0), matrix.GetUpperBound(1)];
}
public int major(int a, int b)
{
if (a > b)
return a;
else
return b;
}
}
}