动态规划-黄金矿工

动态规划是一个经典的问题,在算法实现时经常需要会用到这个思想,黄金矿工是动态规划的景点问题,下面就详细讨论这个问题,如下图所示:

矿产编号钻石储量所需工人数量
14005
25005
32003
43004
53503

我们计算在有m人时,能挖掘的最大价值的黄金,最后得到下表

矿产编号nm=1 人m=2 人m=3 人m=4 人m=5 人m=6 人m=7 人m=8 人m=9 人m=10 人
矿产10000400400400400400400
矿产20000500500500500500900
矿产300200200500500500700700900
矿产400200300500500500700800900
矿产500350350500550650850850900

通过以上的计算过程,我们不难发现,除第一个矿产的相关数据,表格中的其他数据都可以由前一行的一个或两个格子推导而来。例如,3 个矿产 8 个人挖掘的钻石量 F(3,8) 就来自 2 个矿产 8 个人挖掘的钻石量 F(2,8)和 2 个矿产 5 个人挖掘的钻石量 F(2,5),即 F(3,8)=max{F(2,8),F(2,5)+200}=max(500,500+200)=700。
这样我们就可以写如下代码来复现上述实现过程(使用python3实现):

def goldMine(n,w,g,p):
    dp = [[0 for _ in range(n+1)] for _ in range(w)]
    for i in range(1,n+1):
        if i<p[0]:
            dp[0][i] = 0
        else:
            dp[0][i] = g[0]
    for i in range(1,w):
        for j in range(1,n+1):
            if j<p[i]:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - p[i]] + g[i])
    return dp
dp = goldMine(10, 5, [400,500,200,300,350], [5,5,3,4,3])

for i in range(len(dp)):
    print(dp[i])

最后打印结果:

[0, 0, 0, 0, 0, 400, 400, 400, 400, 400, 400]
[0, 0, 0, 0, 0, 500, 500, 500, 500, 500, 900]
[0, 0, 0, 200, 200, 500, 500, 500, 700, 700, 900]
[0, 0, 0, 200, 300, 500, 500, 500, 700, 800, 900]
[0, 0, 0, 350, 350, 500, 550, 650, 850, 850, 900]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值