子集总和:带有“.combination”的Ruby

时间:2015-02-03 07:54:24

标签: ruby arrays combinations

问题详情:查找数组的任何组合是否添加到数组中找到的最大数字。

以下是我尝试实施的步骤:

  1. 从数组中提取最大数字

  2. 创建一个新的数组 可以通过使用添加的所有潜在组合 .combination

  3. 测试这些组合是否等于原始数组中的最大数字。

  4. 状态:到目前为止,我刚收到代码中最后end的意外end错误。 (我在网上找到了关于如何解决Ruby中子集求和问题的不同答案,但是想弄清楚如何使用我到目前为止使用的逻辑来解决它。)

    任何帮助都会很棒!

    def subset_sum(sums)
        largest_number = subset_sum.sort.reverse[0]
        array_without_largest = subset_sum.sort.reverse[1..-1]
        full_combination = []
        i = 0
        while i <= array_without_largest.length
            full_combination = full_combination + array_without_largest.combination(i).to_a.to_s
            i += 1
        end
    
        j = 0
        while j <= full_combination.length
            return true if full_combination[j].inject { |sum, x| sum + x} == largest_number
                j += 1
            end
        end
        return false
    end
    
    puts subset_sum(1,2,3,4,10)
    puts subset_sum(-1,-3,3,9,8)
    

2 个答案:

答案 0 :(得分:0)

考虑一下:

def any_subset_adds_to_max?(array)
  sub_array = array - [array.max]
  every_combination = (1..sub_array.length).flat_map { |n| sub_array.combination(n).to_a }
  every_combination.any? { |combination| combination.reduce(:+) == array.max }
end

[
  [1, 2, 3, 4, 10],
  [-1, -3, 3, 9, 8]
].map { |test_array| any_subset_adds_to_max? test_array } # => [true, false]

答案 1 :(得分:0)

这是我在保持原创性时可以做的最接近的代码示例。它有效,我很感激帮助!

def subset_sum(sums)

  largest_number = sums.max
  array_without_largest = sums - [largest_number]
  full_combination = []

  array_without_largest.size.times do |i|
    full_combination << array_without_largest.combination(i+1).to_a
  end
  full_combination.flatten!(1)

  full_combination.size.times do |i|
    return true if full_combination[i].inject(:+) == largest_number
  end

  false
end