描述:
给定一组数,计算所有组合的和值,比如 2个数的和值,3个数的和值,... ,N-1个数的和值
代码:
import typing
li = []
#所有组合,格式为
# {
# “elenum_1”:{
# "0":li[0],
# "1":li[1],
# ...
# "n":li[n],
# },
# "elenum_2":{
# “(0,1)”:li[0]+li[1],
# “(0,2)”:li[0]+li[2],
# ...
# “(n-1,n)”:li[n-1]+li[n]
# }
#
# }
allzuhe = {}
#以sum作为字典key,这里不再区分元素个数
# {
# “2”:[(0,1),(0,1,2),....,(n-3,n)],
# “x”:[...]
#
# }
allzuhebysumProtein = {}
allzuhebysumFat = {}
allzuhebysumCarbo = {}
liProtein = []
liFat = []
liCarbo = []
liTar = []
class Node:
def __init__(self):
pass
class PNode(Node):
def __init__(self,value,index):
self._val = value
self._index = index
def __str__(self):
return ("[{}]={} ".format(self._index,self._val))
class FNode(Node):
def __init__(self,value,index):
self._val = value
self._index = index
def __str__(self):
return ("[{}]={} ".format(self._index, self._val))
class INode(Node):
def __init__(self,value,index):
self._val = value
self._index = index
def __str__(self):
return ("[{}]={} ".format(self._index, self._val))
NodeList = typing.List[Node]
def getinput():
Inum,Tarnum = [int(x) for x in input().strip().split()]
for i in range(0,Inum):
tmpli = [int(x) for x in input().strip().split()]
liProtein.append(PNode(tmpli[0],i))
liFat.append(FNode(tmpli[1],i))
liCarbo.append(INode(tmpli[2],i))
for j in range(0,Tarnum):
tmpli = [int(x) for x in input().strip().split()]
liTar.append(tmpli)
print("Inum:"+str(Inum))
print("liProtein:",end=":")
for e in liProtein:
print(e,end=";")
print("")
print("liFat:",end=":")
for e in liFat:
print(e,end=";")
print("")
print("liCarbo:",end=":")
for e in liCarbo:
print(e,end=";")
print("")
print("Tarnum:" + str(Tarnum))
print(liTar)
print("")
def getdata_2dim(left:NodeList,right:NodeList,allzuhebysum):
leftvalue = 0
if not left:
return
if not right:
return
for ele in left:
leftvalue += ele._val
#右半部所有元素依次和左半部做和运算
for index,ele in enumerate(right):
tmpsum = leftvalue + ele._val
if not allzuhebysum.__contains__(str(tmpsum)):
allzuhebysum[str(tmpsum)] = []
#存入allzuhebysum
tmpleft = [i._index for i in left] #获取左半部所有元素的下标集合
tmpleft.append(ele._index) #把右半部的下标和左半部下标组合起来
allzuhebysum[str(tmpsum)].append(tmpleft)
newleft = left[:]
newleft.append(right[index])
newright = right[index+1:]
getdata_2dim(newleft, newright, allzuhebysum)
getinput()
#从左到右,依次取起始位置
for i in range(0,len(liProtein)):
getdata_2dim(liProtein[i:i+1],liProtein[i+1:len(liProtein)],allzuhebysumProtein)
for index,ele in enumerate(liProtein):
if not allzuhebysumProtein.__contains__(ele._val):
allzuhebysumProtein[str(ele._val)] = []
allzuhebysumProtein[str(ele._val)].append(index)
for i in range(0, len(liFat)):
getdata_2dim(liFat[i:i + 1], liFat[i + 1:len(liFat)], allzuhebysumFat)
for index,ele in enumerate(liFat):
if not allzuhebysumFat.__contains__(ele._val):
allzuhebysumFat[str(ele._val)] = []
allzuhebysumFat[str(ele._val)].append(index)
for i in range(0, len(liCarbo)):
getdata_2dim(liCarbo[i:i + 1], liCarbo[i + 1:len(liCarbo)], allzuhebysumCarbo)
for index, ele in enumerate(liCarbo):
if not allzuhebysumCarbo.__contains__(ele._val):
allzuhebysumCarbo[str(ele._val)] = []
allzuhebysumCarbo[str(ele._val)].append(index)
print(allzuhebysumProtein)
print(allzuhebysumFat)
print(allzuhebysumCarbo)
for ele in liTar:
ele_p = str(ele[0])
ele_f = str(ele[1])
ele_c = str(ele[2])
match_p = []
match_f = []
match_c = []
print(ele)
if allzuhebysumProtein.__contains__(ele_p):
print("Protein:",end="")
print(allzuhebysumProtein[ele_p])
match_p = allzuhebysumProtein[ele_p]
if allzuhebysumFat.__contains__(ele_f):
print("Fat:", end="")
print(allzuhebysumFat[ele_f])
match_f = allzuhebysumFat[ele_f]
if allzuhebysumCarbo.__contains__(ele_c):
print("Carbo:", end="")
print(allzuhebysumCarbo[ele_c])
match_c = allzuhebysumCarbo[ele_c]
result = []
for ele in match_p:
if match_f.__contains__(ele) and match_c.__contains__(ele):
result.append(ele)
print("result:{}".format(result))
print("")
'''
5 3
12 1 6
5 6 8
2 0 6
1 11 6
2 3 3
15 15 15
13 12 12
7 6 14
'''