python - 打印列表中总和最大且奇数的项目总和

时间:2016-04-01 06:39:26

标签: python list python-3.x

这是我一直试图解决的一个简单问题。首先,我输入一个正整数列表。我想从他们中选择项目,使他们的总数最大可能,他们的总和是奇数。如果无法组合,我想打印-1。我编写了代码,但它无法正常工作。

l = sorted(list(map(int, input().split())))

if sum(l)%2 == 1:
    print(sum(l))

else:
    m = 0
    for x in range(len(l)):
        a = l
        a.pop(x)
        if sum(a)%2 == 1 and sum(a) > m:
            m = sum(a)

例如,对于输入2 3 4 5,它打印9应打印11

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:6)

因此,从数字列表中,您希望获得奇数的最大可能总和。这实际上非常简单,可以很容易地解决。您需要做的是获取所有数字的总和,因为这是您可以从这些数字中获得的最大总和。现在,我们有两个选择:

  1. 总和很奇怪:在那种情况下,我们已经完成了。最大可能的总和也是奇数,所以我们有结果。
  2. 总和是均匀的:在这种情况下,我们有最大可能的总和,但我们并不奇怪。为了解决这个问题,我们需要从总和中删除最小奇数。因此,我们查看已排序的数字列表,并从中选择第一个奇数。通过从偶数和中删除奇数,我们再次得到一个奇数,并且由于我们选择了最小的可能数,我们知道新的和是最大的奇数。这就是结果。
  3. 在代码中,这可能如下所示:

    def largestOddSum(numbers):
        s = sum(numbers)
        if s % 2 == 1:
            return s
    
        for x in sorted(numbers):
            if x % 2 == 1:
                return s - x
    
        return -1
    

    像这样使用:

    >>> largestOddSum([2, 3, 4, 5])
    11
    

答案 1 :(得分:3)

以一种简单的方式: 如果第一个总和是偶数,则加上所有并减去最小奇数:

if sum(l)%2 == 1:
    print(sum(l))
else:
    print(sum(l) - [i for i in sorted(l) if i%2==1][0])

答案 2 :(得分:2)

我认为解决这个问题的最佳方法是记住:

even + even = even
odd + even = odd
odd + odd = even

考虑到这一点,您始终可以包含所有偶数。您也可以始终包含所有奇数,只要奇数的数量不均匀即可。如果赔率的数量是偶数,那么就把最小的赔率排除在外。