问题描述
我有一个元组列表(实际列表可能很大),元组中的第一个元素表示索引,第二个元素表示值。我还有一个数字n
:
lst = [(0,1),(1,2),(2,4),(3,5),(4,(5,2)]
n = 6
我想找到最大的组合,使我得到的值之和小于或等于n
。因此,在此示例中,答案应为以下列表:
[(0,2)]
因为1+2+1+2 = 6
是lst
中最大的值组合,其总和小于或等于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)