Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 查找和为给定数字的元素_Ruby On Rails_Ruby_Arrays_Subset Sum - Fatal编程技术网

Ruby on rails 查找和为给定数字的元素

Ruby on rails 查找和为给定数字的元素,ruby-on-rails,ruby,arrays,subset-sum,Ruby On Rails,Ruby,Arrays,Subset Sum,我必须找到订单金额总和等于或大于给定数字的订单列表。比如说, order # amount o1 100 o2 50 o3 90 o4 150 o5 20 o6 30 o7 50 如果我需要找到订单数量之和等于300或大于300的订单,那么我应该得到o5,o6,o2,o7,o3,o1或o1,o4,o3。无论订单是从最小到最大还是从最大到最小,我如何以最小的方式完成?我知道第一步是分类。我可以

我必须找到订单金额总和等于或大于给定数字的订单列表。比如说,

order #  amount
o1        100
o2         50
o3         90
o4        150
o5        20
o6        30
o7        50
如果我需要找到订单数量之和等于300或大于300的订单,那么我应该得到o5,o6,o2,o7,o3,o1或o1,o4,o3。无论订单是从最小到最大还是从最大到最小,我如何以最小的方式完成?我知道第一步是分类。我可以使用数组求和来获得所有元素的和,但如何获得相加等于或大于给定数字的元素呢


我正在使用RubyonRails和Oracle作为数据库。

您的问题其实很简单。首先,通过减少数量来订购订单:

orders = [["o1", 100], ["o2", 50], ["o3", 90], ["o4", 150],
          ["o5",  20], ["o6", 30], ["o7", 50]] 

sorted_orders = orders.sort_by(&:last).reverse
  #=> [["o4", 150], ["o1", 100], ["o3", 90], ["o7", 50],
  #    ["o2", 50],  ["o6", 30],  ["o5", 20]]
假设:

min_req = 300
首先查看是否可以通过使用所有项目来实现
min_req

orders.reduce(0) { |tot,(_,qty)| tot+qty } < min_req
  #=> false
我们可以将其包装在一个方法中:

def smallest_combination(orders, min_req)
  return nil if orders.reduce(0) { |tot,(_,qty)| tot+qty } < min_req
  tot = 0
  orders.sort_by(&:last)
        .reverse
        .take_while { |_,qty| tot < min_req && tot += qty }
end

smallest_combination(orders, 300)
  #=> [["o4", 150], ["o1", 100], ["o3", 90]] 
smallest_combination(orders, 400)
  #=> [["o4", 150], ["o1", 100], ["o3", 90], ["o7", 50], ["o2", 50]] 
smallest_combination(orders, 500)
  #=> nil
def最小需求组合(订单、最小需求)
如果订单减少(0){| tot,(| tot,qty){tot+qty}[[“o4”,150],“o1”,100],“o3”,90]]
最小组合(订单,400)
#=>[[“o4”,150],“o1”,100],“o3”,90],“o7”,50],“o2”,50]]
最小组合(订单,500)
#=>零

您使用的是什么DB客户端?Mysql、Sqllite3等。。哪一个?我想你的问题可能遗漏了什么。由于金额都是非负的,所以您可以简单地包括所有项目。要么就足够了,要么就无法实现目标。我怀疑您指定了约束条件,但没有指定目标。是否要查找满足要求的所有订单组合?…或者是项目数最少的订单组合?是的,是项目数最少的订单组合。我需要找到符合条件的最小订单数,然后根据业务规则取消这些订单。您能告诉我这两者如何等于250或大于300吗?
def smallest_combination(orders, min_req)
  return nil if orders.reduce(0) { |tot,(_,qty)| tot+qty } < min_req
  tot = 0
  orders.sort_by(&:last)
        .reverse
        .take_while { |_,qty| tot < min_req && tot += qty }
end

smallest_combination(orders, 300)
  #=> [["o4", 150], ["o1", 100], ["o3", 90]] 
smallest_combination(orders, 400)
  #=> [["o4", 150], ["o1", 100], ["o3", 90], ["o7", 50], ["o2", 50]] 
smallest_combination(orders, 500)
  #=> nil