查找总和小于或等于某个值的最长组合的算法

问题描述

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

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

我想找到最大的组合,使我得到的之和小于或等于n。因此,在此示例中,答案应为以下列表:

[(0,2)]

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

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

解决方法

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

if (session == null
                || session.getAttribute(USER_KEY_IN_SESSION) == null) {
            // It comes here...
        }

礼物:

<?php
$str = "<string xmlns=\"http:\/\/schemas.microsoft.com\/2003\/10\/Serialization\/\">
    {\"response\":\"0\",\"errorMsg\":\"\",\"lstsmi\":[{\"code_bordereau\":\"111111111\",\"etat\":\"yes\"},{\"code_bordereau\":\"222222222\",\"etat\":\"yes\"}]}<string>";
    
@$doc = new DOMDocument();
@$doc->loadHTML($str);
$real_json_string = $doc->textCotent;
$json = json_decode($real_json_string,true);
echo print_r($json);
?>
,

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

from operator import itemgetter

lst = [(0,1),(1,2),(2,4),(3,5),(4,(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,2)]
,
lst = [(0,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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...