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