【问题标题】:python - print the sum of items in list whose total is the largest and is oddpython - 打印列表中总和最大且奇数的项目的总和
【发布时间】:2016-04-01 15:43:48
【问题描述】:

这是一个我一直试图解决的简单问题。首先,我输入一个正整数列表。我想从它们中选择项目,以使它们的总数尽可能大并且它们的总和是奇数。如果无法组合,我想打印-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,它在应该打印 11 的地方打印 9。

任何帮助将不胜感激。

【问题讨论】:

  • 你的意思是:它们的总和是最大的并且它们的总和是奇数。? total 不就是 sum 的意思吗?
  • 换一种方式来计算。最大值,但奇数,是最大值减去最小值为奇数。你的程序完成了它的工作:2 + 3 + 4 = 9...如果我加 5,我有一个奇数,所以,不要加它...所以返回 9。这不是完成这项工作的好算法
  • @A.H.是的,我感觉是这样。但我仍然想不出任何这样的算法。
  • 其他人解决了更好的算法。但是,发布的代码无法编译 - 存在缩进错误。你还需要a = l.copy(),否则每次迭代只会缩短同一个列表,索引最终会超出范围。
  • @AndrewSwann 我已经意识到这个错误,并且已经在我的计算机中的文件中进行了更改。当我将代码粘贴到网站上时,可能会出现缩进错误。无论如何,现在我正在使用 poke 的算法。

标签: python list python-3.x


【解决方案1】:

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

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

在代码中,可能如下所示:

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

【讨论】:

    【解决方案2】:

    以一种简单的方式: 如果第一个和为偶数,则全部相加并减去最小奇数:

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

    【讨论】:

    • 这会计算总和两次,在偶数情况下还会再次迭代整个数字列表。然后它减去第二小的数字......?
    • 这也会抛出一个IndexError 用于只有偶数的列表(例如[2, 4])。
    • 没错,但它想要。我不想给学术问题一个“完美”的解决方案。 ;)
    • 结果还是错了。对于 OP 的示例,您的解决方案是给出 9 而不是 11。
    • 我的编辑器复制/粘贴错误。对不起。 index[0] 不是 [1] :'(。谢谢
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2019-03-21
      • 2013-02-10
      • 2022-01-18
      相关资源
      最近更新 更多