1、使用递归方法
yuanzhen@ubuntu:~/P_script$ cat mine_dp_1.py
#!/usr/bin/env python
def get_file(file_in):
fd_list=[]
f_in=open(file_in,"r")
for l_raw in f_in:
line=l_raw.strip().split(" ")
fd_list.append([int(x) for x in line]);
f_in.close()
return fd_list
def init(fd_list):
pNeed_list=[]
Gold_list=[]
for p,g in fd_list[1:]:
pNeed_list.append(p)
Gold_list.append(g)
return pNeed_list, Gold_list
def getMaxGold(people, mineNum):
if (people, mineNum) in set(sumGold.keys()):
retgold=sumGold[(people,mineNum)]
elif mineNum==0:
if people>=peopleNeed[mineNum]:
retgold=Gold[mineNum]
else:
retgold=0
else:
if(people>=peopleNeed[mineNum]):
retgold=max(getMaxGold(people,mineNum-1), getMaxGold(people-peopleNeed[mineNum], mineNum-1)+Gold[mineNum])
else:
retgold=getMaxGold(people,mineNum-1)
sumGold[(people, mineNum)]=retgold
return retgold
def main():
file_in="/home/yuanzhen/P_script/01beibao/beibao0.in"
fd_list=get_file(file_in)
print fd_list
peopleTotal=fd_list[0][0]
mine=fd_list[0][1]
global sumGold, peopleNeed, Gold
sumGold={}
peopleNeed,Gold=init(fd_list)
print peopleTotal, mine
print peopleNeed
print Gold
maxgold=getMaxGold(peopleTotal, mine-1)
print maxgold
main()
#################################
2、动态规划方法
yuanzhen@ubuntu:~/P_script$ cat mine_dp_2.py
#!/usr/bin/env python
def get_file(file_in):
fd_list=[]
f_in=open(file_in,"r")
for l_raw in f_in:
line=l_raw.strip().split(" ")
fd_list.append([int(x) for x in line]);
f_in.close()
return fd_list
def init(fd_list):
pNeed_list=[]
Gold_list=[]
for p,g in fd_list[1:]:
pNeed_list.append(p)
Gold_list.append(g)
return pNeed_list, Gold_list
def getMaxGold(people, mine):
for people_i in range(0,people+1):
for mine_j in range(mine+1):
people_num=peopleNeed[mine_j]
if mine_j==0:
if people_i>=people_num:
sumGold[(people_i, mine_j)]=Gold[mine_j]
else:
sumGold[(people_i, mine_j)]=0
else:
if people_i>=people_num:
sumGold[(people_i, mine_j)]=max(sumGold[(people_i-people_num, mine_j-1)]+Gold[mine_j], sumGold[(people_i,mine_j-1)])
else:
sumGold[(people_i, mine_j)]=sumGold[(people_i, mine_j-1)]
return sumGold[(people, mine)]
def main():
file_in="/home/yuanzhen/P_script/01beibao/beibao0.in"
fd_list=get_file(file_in)
print fd_list
peopleTotal=fd_list[0][0]
mine=fd_list[0][1]
global sumGold, peopleNeed, Gold
sumGold={}
peopleNeed,Gold=init(fd_list)
print peopleTotal, mine
print peopleNeed
print Gold
maxgold=getMaxGold(peopleTotal, mine-1)
print maxgold
main()
########################################
输出结果
[[100, 5], [77, 92], [22, 22], [29, 87], [50, 46], [99, 90]]
100 5
[77, 22, 29, 50, 99]
[92, 22, 87, 46, 90]
133