【问题标题】:Algorithm for checking a given number is a sum of combinations in a given array检查给定数字的算法是给定数组中组合的总和
【发布时间】:2015-10-31 02:33:49
【问题描述】:

有没有一种算法可以告诉我输入的数字是否是给定数组的组合。数组中的数字可以使用n次 例如:- 给定数组:-(1、5、7 和 10) 输入:- 17(是的,因为 10x1 +7x1) 65(是的,因为 10x6 + 5x1).. 这里 10 被使用了 6 次。 输出:-2 7

【问题讨论】:

  • 65(yes since 6x10 + 5x1) 我一直揉着老眼睛,但在给定数组中看不到6
  • 请添加更多详细信息,即是否允许多次使用一个数字,是否允许使用括号?您的数组中也没有 6。
  • @xashru 是的,数字可以使用n次,10乘以6次
  • 不是背包问题吗?

标签: algorithm


【解决方案1】:

如果允许您在数组中任意多次使用任何数字,那么有一个简单的算法(但不是最好的),我将只描述该算法。

对于给定的数字M,首先尽可能多地使用数组中最大的数字。如果k 是最大的数字,则找到n 使得k*n <= Mk*(n+1) > M。然后用数组中第二大的数来填补k*nM之间的空隙,以此类推。

示例:如果您的数组是[1, 5, 7, 10]M=138,则尽可能多地使用10(这是数组中的最大数字)以尽可能接近M 而不会越过。在这种情况下,它是 13 次,因为 10*13 = 130 < M = 13810*14 > 140 > 138 = M。然后使用第二大数字 7 来填充缺失的部分,即 8 (138-130)。然后,显然尝试使用5(这不起作用),最后使用1。所以你得到1+7+10*13 = 138。

上述算法不能保证有效。如果我们的数组是 [5, 7, 10],那么算法不会找到解决方案,如果存在的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多