繁体   English   中英

如何将项目从最大值到最小值(python)

[英]How to sum items from largest value to smallest (python)

我正在尝试编写一个程序,它将列表中的项目从最大到最小,直到某个值。 (这是一个关于“背包问题”的练习)。 我想出这个来找到列表中价值最大的项目,然后将其添加到变量ptvt

knapsack = []
l1 = [300.0, 400.0, 600.0, 1300.0, 2000.0]
l2 = [100.0, 400.0, 300.0, 700.0, 2000.0]
l3 = [0.3333333333333333, 1.0, 0.5, 0.5384615384615384, 1.0]
    
    while pt <= c:
        for i in range(len(l3):
            if i not in knapsack:
                if l3[i] > m:
                    m = l3[i]
                    v = l2[i]
                    p = l1[i]
                    knapsack.append(i)
                    
                if l3[i] == m and l1[i] < p:
                    m = l3[i]
                    v = l2[i]
                    p = l1[i]
                    knapsack.append(i)

            i += 1
        i = 0
        pt += p
        vt += v

但是,我无法让for循环跳过之前找到的最大值,因此它在每次迭代中都为ptvt添加了 400。 我尝试解决将 i 值添加到knapsack列表但它不起作用的问题。

OBS:目标是将具有最大值l1与重量l2比率的值添加到背包中,为此我创建了第三个列表l3 如果比率相同,则打破平局的标准是重量最小的项目,这就是.sort() function 不起作用的原因——每个值在其他列表中都有 2 个对应值。

这是一个解决方案:

# the input lists
l1 = [300.0, 400.0, 600.0, 1300.0, 2000.0]
l2 = [100.0, 400.0, 300.0, 700.0, 2000.0]

# the result list
l3 = [l2[i]/l1[i] for i in range(len(l1)) ]


# the sorted list (highest to lowest)
reversed_sorted = sorted(l3, reverse=True)


# some value to be used as a limit
some_value = 3


the_total=0 # value to keep adding
for i in reversed_sorted:
    if the_total + i >  some_value:
        # if go above value then exit
        break
    else:
        the_total = the_total + i
        # otherwise add next item

# print result
print(the_total)

请注意,最终循环 cna 被压缩为list comprehension

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM