动态规划,求解金矿
2018-01-19 14:03
176 查看
问题描述: 国王发现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
:F(n-1,w); w>=p
:Max(F(n-1,w-p
)+m
,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];
}
金矿概况: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
:F(n-1,w); w>=p
:Max(F(n-1,w-p
)+m
,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];
}
相关文章推荐
- 算法 - 动态规划(通过金矿模型介绍动态规划)
- 通过金矿模型介绍动态规划(转)
- 利用动态规划求解Fibonacci数列
- 通过金矿模型介绍动态规划
- 最长递增子序列动态规划求解和利用二分查找去优化动态规划,优化成n*logn
- 动态规划求解0-1背包
- 动态规划求解背包问题(java版本)
- 矩阵连乘 动态规划求解
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- 动态规划求解连续子数组最大和问题(应该是新的描述方法?)
- 用动态规划求解0-1背包问题
- 动态规划求解最长公共子串问题
- 53. Maximum Subarray动态规划求解最大子串问题
- 动态规划求解最长公共子串的问题
- 通过金矿模型介绍动态规划
- 动态规划求解数组连续最大和
- 通过金矿模型介绍动态规划
- 动态规划求解扎气球得金币游戏
- 1040 -- 用动态规划求解矩阵乘法链问题
- 动态规划5:求解最多航线问题(应用了最长子序列知识)