您的位置:首页 > 其它

动态规划,求解金矿

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];

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划