動態規劃 python 挖礦問題

#!/usr/bin/env python
# encoding: utf-8

import copy
def good(n,w,g=[],p=[]):
    # n爲金礦數,w爲人數,g爲金礦數組,p爲人數數組
    arr = [0]*w
    for i in range(w):
        if (i+1)>=p[0]:    # i爲座標, i+1爲人數
            arr[i] = g[0]
    res = copy.deepcopy(arr)  #深copy
    print(res)
    # 上面爲只有一個金礦的狀況
    for i in range(1,n):      # 金礦數
        # 每一層表明前N個金礦人工數(1~10)人的解
        # 前一層已經求出相同人數時選取不一樣金礦的最大值因此能夠疊加 
        for j in range(w):    # 人工數
            if (j+1)<p[i]:     # j爲座標, j+1爲人數
                arr[j] = res[j]   #和上一次狀況相同
            else:
                t = 0 if (j-p[i])<0 else j-p[i]    #防止負數取到後面的值
                arr[j] = max(res[j],res[t]+g[i])    #挖和不挖第i座金礦比較取大
                #res[t]+g[i] 爲 挖第i座金礦的狀況,res[已有人數 - 第i座所需人數]+第i座金子g[i]
        res = copy.deepcopy(arr)
        print(res)
    return res.pop()
 
if __name__ == '__main__':
    res = good(5,10,[400,500,200,300,350],[5,5,3,4,3])
相關文章
相關標籤/搜索