[DnA] 一组数的所有和值组合(食谱搭配问题)

描述:

给定一组数,计算所有组合的和值,比如 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
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值