数组中元素的随机总和等于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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章