动态规划,求解金矿

问题描述: 国王发现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];


        }

    原文作者:动态规划
    原文地址: https://blog.csdn.net/smj20170417/article/details/79106040
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞