问题描述: 国王发现5座金山,派出10个人进行挖金,对于每个人只能用一次,对于每座金山,要么全部挖尽,要么不挖,要尽可能多的获取金矿,应该选择挖取哪几座金矿?
金矿概况:500金/5人、200金/3人、300金/4人、350金/3人、400金/5人
问题分析:分别用n,w,m[],p[]代表金矿总数、派出总人数、金矿的金量、金矿的所需人数;若给金矿进行编号:对于第5座金矿和第4座金矿的关系:
* 若进行挖掘:F(4,w-p[4])+m[4] 若不进行挖掘:F(4,10); 总金量=Max(F(4,w-p[4])+m[4],F(3,w));
* 此问题的边界为,当只有1座金矿时,若w<p[0],则为0 ;若w>=p[0],为m[0];
* 当金矿数量大于1座时,w<p[n]:F(n-1,w); w>=p[n]:Max(F(n-1,w-p[n])+m[n],F(n-1,w))
求解方法:
static int Method_1(int n,int w,int [] m,int [] p)
{
int[] preResult = new int[w];
int[] result = new int[w];
for(int i = 0; i <p.Length; i++)
{
if (w < p[i])
{
preResult[i] = 0;
}
else
{
preResult[i] = m[i];
}
}
for(int i = 0; i < n; i++)//金矿
{
for(int j = 0; j < w; j++)//挖矿工数
{
if (j < p[i])
{
result[j] = preResult[j];
}
else
{
result[j] = (preResult[j - p[i]] + m[i]) > preResult[j] ? (preResult[j - p[i]] + m[i]) : preResult[j];
}
}
preResult = result;
}
return result[n-1];
}