Ruby on rails 数组中元素的随机和等于y-ruby

Ruby on rails 数组中元素的随机和等于y-ruby,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,需要创建一个数组,其总和应等于期望值 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

需要创建一个数组,其总和应等于期望值

 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
arr=[5,10,15,20,30]
ee=[]
最大值=200
而(ee.sum随机
元素

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]
...
请注意,这种方法对于长长度输入无效。同样,如果任何原始数组的成员可能被多次使用,则应将上述内容更改为,但此解决方案太无效,无法与
置换一起使用

您可以获取结果数组的
随机
元素

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]
...

请注意,这种方法对于长长度输入无效。同样,如果任何原始数组的成员可能被多次使用,则应将上面的更改为,但此解决方案太无效,无法与
置换一起使用

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


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


这是一个好问题。到目前为止你都试了些什么?@sagarpandya2,我补充道it@falsetru,这不是一个重复的问题。这里可以在输出中使用重复的值,这在任何问题中都不存在。从这个问题中删除“复制”一词。这是一个好问题。到目前为止你都试了些什么?@sagarpandya2,我补充道it@falsetru,这不是一个重复的问题。这里可以在输出中使用重复的值,这在任何问题中都不存在。请删除此问题中的“复制”一词。谢谢,一个小小的想法,即使目标是一个数组中的2000个重复元素也可以使用。谢谢,一个小小的想法,即使目标是一个数组中的2000个重复元素也可以使用。谢谢,一个小小的想法,即使目标是一个数组中可以使用的2000个重复元素,它也应该可以工作。谢谢,一个小小的想法,即使目标是一个数组中可以使用的2000个重复元素,它也应该可以工作。
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)