• 利用list元素求和组成某一个固定值


    最近玩小游戏写脚本遇到一个问题,要用一个堆数字比如[2,5,2,2,6],用其中的元素求和组成某一个数字比如12,可以知道答案是[2,2,2,6]。那么如何使用代码让它实现出来呢?
    我想了很久,最后想了一个利用递归的枝叶裁剪法。比如以上的例子
    1.看12是否在数字堆中,不在
    2,看11是否在,不在
    。。。
    4,6在。将6添加到暂时list中[6],那么还需要12-6=6。
    5,6虽然在数字堆中,但是只有一个。所以看5是否在,5在。 list[6,5],需要 12-6-5=1
    6,1不在数字堆。所以从list中取出最近添加的元素,5,并减1。 list[6]  需要 4
    7,4 不在
    8,3不在
    9,2在 list[6,2] 需要12-6-2=4
    ...
    12,2在  list[6,2,2] 需要12-6-2-2=2
    13 2在  list[6,2,2,2]


    这个想法我也不记得从哪参考的了,总之用递归的方法可以逐步实现。此外这个算法的思想是优先添加最大的字数字,如果想要优先添加最小数字,在添加元素的时候就应从1开始,逐步加1。以下是python 实现的代码。

    
    
    def getsubArr(elementArr,Arr,Sum,Num):
        '''elementArr:包含所有元素的list;Arr:暂时list;Sum:需要求和的值;Num:哨兵值'''
        if Num==0:
            if sum(Arr)==Sum:
                return Arr
            #若是求的和已经满足,返回数组
            else:
                newNum = Num
                tempArr =Arr
                
                if len(tempArr)==0:
                    return None
                    #已经搜索所有的可能,没有结果,返回空
                else:
                    t = tempArr.pop()
                    return getsubArr(elementArr,tempArr,Sum,t-1)
        
        newNum = Num
        tempArr =Arr
    
        if elementArr.count(newNum) > tempArr.count(newNum) and elementArr.count(newNum) > 0:
            if newNum+sum(Arr) <=Sum:            
                tempArr.append(newNum)
                return getsubArr(elementArr,tempArr,Sum,Sum-sum(tempArr))
            else:
                return getsubArr(elementArr,tempArr,Sum,newNum-1)
        else :
            
            return getsubArr(elementArr,tempArr,Sum,newNum-1)
    
    
    
     

    使用如下:

    print getsubArr([2,3,6,1,8,3,12,18,8,3,7],[],26,26)

    输出如下

  • 相关阅读:
    对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
    教你实现华为快应用深色主题适配
    如何实现一个malloc
    如何提高团队管理能力?
    大型网站架构演变和知识体系
    call_user_func 和 call_user_func_array用法
    源码研究:php变量
    http协议简介
    用c语言实现http请求
    用socket写一个简单的客户端和服务端程序
  • 原文地址:https://www.cnblogs.com/NewsunLs/p/9166144.html
Copyright © 2020-2023  润新知