数组中元素的随机总和等于y - ruby​​ [重复]

Posted

技术标签:

【中文标题】数组中元素的随机总和等于y - ruby​​ [重复]【英文标题】:Random sum of elements in an array equals to y - ruby [duplicate] 【发布时间】:2016-07-03 09:38:26 【问题描述】:

需要创建一个总和应该等于期望值的数组。

 inp = [1,2,3,4,5,6,7,8,9,10]
 sum = 200

输出:

out = [10,10,9,1,3,3,3,7,.....]  whose sum should be 200
or
out = [10,7,3,....]              Repeated values can be used
or
out = [2,3,4,9,2,....]

我试过了,

arr = [5,10,15,20,30]
ee = []
max = 200
while (ee.sum < max) do
  ee << arr.sample(1).first
end

ee.pop(2)
val = max - ee.sum
pair = arr.uniq.combination(2).detect  |a, b| a + b == val 
ee << pair
ee.flatten

有什么有效的方法吗。

【问题讨论】:

这是个好问题。到目前为止,您尝试过什么? @sagarpandya82,我已经添加了 @falsetru,这不是一个重复的问题。这里可以在输出中使用重复的值,这在任何问题中都不存在。从这个问题中删除重复的单词。 【参考方案1】:
inp = [1,2,3,4,5,6,7,8,9,10]
sum = 20

inp.length.downto(1).flat_map do |i|
  inp.combination(i).to_a # take all subarrays of length `i`
end.select do |a| 
  a.inject(:+) == sum     # select only those summing to `sum`
end

可能会采用结果数组的random 元素。

result = inp.length.downto(1).flat_map do |i|
  inp.combination(i).to_a # take all subarrays of length `i`
end.select do |a| 
  a.inject(:+) == sum     # select only those summing to `sum`
end
puts result.length
#⇒ 31
puts result.sample
#⇒ [2, 4, 5, 9]
puts result.sample
#⇒ [1, 2, 3, 6, 8]
...

请注意,这种方法对于长输入来说效率不高。同样,如果任何原始数组的成员可能被多次取走,则上面的combination 应更改为permutation,但此方案与permutation 一起使用效率太低。

【讨论】:

谢谢,一个小小的想法,即使目标是 2000 也应该可以工作 可以使用数组中的重复元素。【参考方案2】:

我在以下链接中找到了这个问题的答案:

Finding all possible combinations of numbers to reach a given sum

def subset_sum(numbers, target, partial=[])
 s = partial.inject 0, :+
 #check if the partial sum is equals to target
 puts "sum(#partial)=#target" if s == target
 return if s >= target  #if we reach the number why bother to continue
 (0..(numbers.length - 1)).each do |i|
   n = numbers[i]
   remaining = numbers.drop(i+1)
   subset_sum(remaining, target, partial + [n])
 end
end

subset_sum([1,2,3,4,5,6,7,8,9,10],20)

【讨论】:

谢谢,一个小小的想法,即使目标是 2000 也应该可以工作 可以使用数组中的重复元素。

以上是关于数组中元素的随机总和等于y - ruby​​ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中,如何在数组中存储随机数等于某些总和的次数?

c_cpp 检查数组中是否存在两个元素,其总和等于数组其余部分的总和

数组中等于 N 的 K 个元素的总和

检查数组中两个不同数字的总和是不是等于变量数?

查找等于给定总和的数组元素[关闭]

是否可以对数组中的每 3 个相邻元素求和,并使用向量指令使它们中的每一个都等于总和?