gm = [[77,92], [22, 22], [29, 87], [49, 46], [99,90]]
gold = []
for i in range(100):
gold.append([-1] * 5)
def gold_mine(p , n):
# 边界 第一个金矿 人数够就挖 不够就不挖
if n == 1:
return 0 if p < gm[n - 1][0] else gm[n - 1][1]
# 数据已经保存了
if gold[p - 1][n - 1] != -1:
return gold[p - 1][n - 1]
# 状态转移方程式
if p < gm[n - 1][0]:
_max = 0
else:
# 最优子结构
_max = max(gold_mine(p, n - 1), gold_mine(p - gm[n - 1][0], n - 1) + gm[n - 1][1])
gold[p - 1][n - 1] = _max
return _max
# 动态规划
def DP_gold_mine(p, n):
import copy
lst = [0] * p
for i in range(1, p + 1):
# 如果人数足够
if i > gm[0][0]:
lst[i - 1] = gm[0][1]
_preLst = copy.deepcopy(lst)
for i in range(1, n):
for j in range(p):
people = j + 1
# if
if people < gm[i][0]:
lst[j] = 0
else:
# 此矿挖了之后 剩余的人数
remaining = people - gm[i][0] if people - gm[i][0] >= 1 else 1
# 选择挖的话 就是上一个金矿的remaining值加上这个金矿的值
lst[j] = max(_preLst[j], _preLst[remaining - 1] + gm[i][1])
_preLst = copy.deepcopy(lst)
return lst.pop()
print(gold_mine(100, 5))
print(DP_gold_mine(100, 5))