【问题标题】:Find array elements equal to a given sum [closed]查找等于给定总和的数组元素[关闭]
【发布时间】:2012-03-09 05:25:06
【问题描述】:

假设数组是:[1, 2, 5, 7, 10, 13, 17, 21],你必须找到 5 个和等于 31 的数字。算法是什么?

【问题讨论】:

  • 嗯。背包问题。 NP-完全。
  • 这是一个问题吗?首先提及您尝试过什么。
  • 如果你不关心效率,也许只是蛮力它......?
  • NP-complete 意味着 没有 没有有效的解决方案 - 不是真的。你能做的最好的就是蛮力。
  • 嗯,我正在考虑嵌套 for 循环来遍历每个元素并添加它们并将添加的输出存储在变量中并检查它是否等于目标总和。但显然这样不好。所以,正在征求建议。

标签: java c++ algorithm


【解决方案1】:

对于像您这样的小型阵列,效率并不重要。诀窍是让它快速。像这样的东西会起作用(用 Matlab 编写,但它可以很容易地翻译成任何语言):

array=[1, 2, 5, 7, 10, 13, 17, 21];
sum_val=31;

for a=1:(length(array)-4]
for b=(a+1):(length(array)-3)
for c=(b+1):(length(array)-2)
for d=(c+1):(length(array)-1)
for e=(d+1):(length(array)-0)
if array(a)+array(b)+array(c)+array(d)+array(e)=sum_val
fprintf("%i+%i+%i+%i+%i=%i",array(a),array(b),array(c),array(d),array(e),sum_val);
end
end
end
end
end

【讨论】:

  • 谢谢 Pearsonartphoto,实际上那个小数组只是为了举例.. :)
  • @DarkKnight:我想了这么多......可以做很多优化,例如,如果你超过了 sum_value,然后跳到下一个循环,等等。但它是一个开始。
  • @Pearsonartphoto:(+1) 不是为解决方案,而是为您的照片...;)...真棒摄影..:)
猜你喜欢
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多