【问题标题】:Algorithm to find the longest combination who's sum is less than or equal to a value查找总和小于或等于某个值的最长组合的算法
【发布时间】:2020-12-23 22:02:04
【问题描述】:

我有一个元组列表(实际列表可能很大),元组中的第一个元素表示索引,第二个表示值。我还有一个号码n

lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
n = 6

我想找到最大的组合,它可以得到小于或等于n 总和。所以在这个例子中,答案应该是一个类似下面的列表:

[(0,1), (1,2), (4,1), (5,2)]

因为1+2+1+2 = 6lst 中最大的值组合,其总和小于或等于n

我需要找到适用于至少包含 200-300 个元素的列表的东西。

【问题讨论】:

    标签: python python-3.x computer-science


    【解决方案1】:

    首先按值对元组进行排序,然后在不超过限制的情况下尽可能多地获取:

    from operator import itemgetter
    
    lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
    n = 6
    
    sorted_list = sorted(lst, key=itemgetter(1))
    
    out = []
    total = 0
    
    for index, value in sorted_list:
        total += value
        if total <= n:
            out.append((index, value))
        else:
            break
            
    print(out)
    # [(0, 1), (4, 1), (1, 2), (5, 2)]
    

    【讨论】:

      【解决方案2】:

      使用按值递增顺序排序的列表副本,累积元组直到总数超过目标,然后再按索引顺序排序。

      lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
      n = 6
      
      total = 0
      answer = []
      for tup in sorted(lst, key=lambda t:t[1]):
          val = tup[1]
          if total + val > n:
              break
          answer.append(tup)
          total += val
      
      answer.sort(key=lambda t:t[0])
          
      print(answer)
      

      给予:

      [(0, 1), (1, 2), (4, 1), (5, 2)]
      

      【讨论】:

        【解决方案3】:
        lst = [(0,1), (1,2), (2,4), (3,5), (4,1), (5,2)]
        
        n = 5
        
        sorted_lst_second_element = sorted(lst, key=lambda x: x[1])
        
        sum = 0
        max_sum_list = []
        for i in range (len(lst) - 1):
            sum = sum + sorted_lst_second_element[i][1]
            if sum<=n:
                max_sum_list.append(sorted_lst_second_element[i])
            else:
                break
        
        print(sorted_lst_second_element)
        print(max_sum_list)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-19
          • 2010-09-26
          • 2017-03-16
          • 2016-09-30
          • 2014-12-20
          • 1970-01-01
          • 2014-07-19
          • 2015-05-25
          相关资源
          最近更新 更多