这里已经存在个一个字典,名字为subjects,形式如下{'14.26':(7,1),......},其中的键的名字都是字符串,值的第一位为value,第二位为work。而第一个函数中的maxwork,是work的上限。以...
这里已经存在个一个字典,名字为subjects,形式如下{'14.26':(7,1),......},其中的键的名字都是字符串,值的第一位为value,第二位为work。而第一个函数中的maxwork,是work的上限。以下的一个函数将要遍历整个字典,直到把满足maxwork的总的value算出来。-----------但是事实上,编译未通过。显示unsupported operand type(s) for +: 'int' and 'tuple',整数不能和元组相加。但问题是,s[WORK]不是元组啊。。。
VALUE,WORK=0,1
def dpAdvisor(subjects, maxWork):
nameList=subjects.keys()
tupleList=subjects.values()
bestSubset, bestSubsetValue = \
dpAdvisorHelper(tupleList, maxWork, 1, None, None, [], 0, 0,{},{})
outputSubjects = {}
for i in bestSubset:
outputSubjects[nameList[i]] = tupleList[i]
return outputSubjects
def dpAdvisorHelper(subjects,maxWork,i,bestSubset,bestSubsetValue,
subset,subsetValue,subsetWork,m_set,m_value):
try:
return m_set[i,subsetValue,subsetWork],m_value[i,subsetValue,subsetWork]
except KeyError:
if i>=len(subjects):
if bestSubset == None or subsetValue > bestSubsetValue:
m_set[(i,subsetWork,subsetValue)],m_value[(i,subsetWork,subsetValue)]=None,0
return subset[:], subsetValue
else:
m_set[(i,subsetWork,subsetValue)],m_value[(i,subsetWork,subsetValue)]=None, 0
return bestSubset, bestSubsetValue
else:
s=subjects[i]
withoutSubset, withoutSubsetValue = dpAdvisorHelper(subjects,
maxWork, i+1, bestSubset, bestSubsetValue, subset,
subsetValue, subsetWork,m_set,m_value)
if subsetWork+s[WORK]>maxWork:
withoutSubset, withoutSubsetValue=dpAdvisorHelper(subjects,
maxWork, i+1, bestSubset, bestSubsetValue, subset,
subsetValue, subsetWork,m_set,m_value)
m_set[(i,subsetWork,subsetValue)],m_value[(i,subsetWork,subsetValue)]=bestSubset, bestSubsetValue
return withoutSubset, withoutSubsetValue
else :
withSubset,withSubsetValue=s[WORK]+dpAdvisorHelper(subjects,
maxWork, i+1, bestSubset, bestSubsetValue, subset,
subsetValue + s[VALUE], subsetWork + s[WORK],m_set,m_value)
if withSubsetValue>withoutSubsetValue:
bestSubset,bestSubsetValue=withSubsetValue,withSubsetValue
else:
bestSubset,bestSubsetValue=withoutSubsetValue,withoutSubsetValue
m_set[(i,subsetWork,subsetValue)],m_value[(i,subsetWork,subsetValue)]=bestSubset,bestSubsetValue
return bestSubset,bestSubsetValue
展开