【问题标题】:Ruby - "Vending Machine" returning Change [closed]Ruby - “自动售货机”返回更改 [关闭]
【发布时间】:2018-08-13 00:36:18
【问题描述】:

在 ruby​​ 中,我正在尝试制作一个简单的财务脚本来返回一组数字[i],代表用户输入的金额[n] .

我的数组将付款的“部分”:[5.0, 1.5, 0.5, 2, 1] 分成总金额的分期付款。

示例:arr = [5.0, 1.5, 0.5, 2, 1] 中,总量等于10.0

如果用户输入4.5,该方法应该将[i]作为[1.5, 2, 1]返回。

谁能帮我构建[i] 方法?

【问题讨论】:

  • 您是否正在寻找总和为所需值的arr 子集?如果是这样,这些值是否必须是连续的?你怎么知道总和是可以实现的?我认为您需要编辑您的问题,目前还很模糊。
  • 为什么输入4.5会返回[1.5, 2, 1]?这并不能解释任何模式。 9.4 会发生什么? -0.1? 9834455.0?
  • 如果结果是明确定义的,那么逻辑是什么?你在你的问题中根本没有解释这一点。 (即使您需要从原始arr 中选择值,它仍然模棱两可——2 应该表示为[1.5, 0.5],还是[1, 1],还是[2]?)如果结果是随机的,那么有限制吗? (我们是否仅限于 arr?我们可以重复值吗?如果没有解决方案怎么办?)同样,您在问题中根本没有指定这一点。
  • 我投票结束这个问题,因为不清楚你在问什么。您需要给出精确的要求;这是模棱两可的,可以解释。
  • 快捷方式:arr.reduce(0.0, &:+).

标签: arrays ruby sum


【解决方案1】:

正如@pjs 所说,您的问题看起来很模棱两可。

如果您想获得数组的总和,只需使用:array.reduce(0.0, &:+) 甚至 array.sum

如果你想得到一个数组,该数组将与给定的N 相加,那么你没有给我们足够的细节。什么是限制?你就不能像4.5 -> [1, 1, 1, 1, 0.5] 那样做吗?

更新

作者给了我们一个细节。我们有数组[5.0, 1.5, 0.5, 2, 1],根据给定的数字N,我们应该从这个数组中找到一个等于N的数字的总和。基本上就像自动售货机找零问题(应该给客户什么硬币)。

您可以像“自动售货机更改算法”一样搜索它。例如:Java Algorithm to solve vendor machine 'change giving' problem

这是我的简单动态编程解决方案:

ALLOWED_NUMBERS = [5.0, 1.5, 0.5, 2, 1].sort.freeze

def into_sum_of_allowed_numbers(n)
  return [] if n == 0
  @cache ||= {}
  return @cache[n] if @cache[n]

  ALLOWED_NUMBERS.reverse_each do |x|
    next if n - x < 0
    lesser_sum = into_sum_of_allowed_numbers(n - x)
    next unless lesser_sum
    @cache[n] = lesser_sum + [x]
    return @cache[n]
  end
  nil
end

into_sum_of_allowed_numbers(4.5) # ==> [0.5, 2, 2]

基本上,这个想法很简单。对于允许的数字a, b, c,数字n 的总和是[*sum_for(n - a), a][*sum_for(n - c), c][*sum_for(n - c), c]

您可以不使用@cache 来执行此操作,但会慢得多。

我想有更好的解决方案,但递归的解决方案对我来说看起来最简单。

【讨论】:

  • 我有一个表示全额付款的值,在这种情况下,全额等于 10。我的数组将这笔付款的“部分”[5.0, 1.5, 0.5, 2, 1] 分成总分期付款数量。所以,如果有人付给我 3.5,我知道在我的数组中应该返回 21.5
  • @gbs0 啊,所以,基本上,你有一个接近自动售货机更换问题的问题
  • @gbs0 查看我的更新答案。并编辑您的初始问题
  • 非常感谢您的回答!!给我一盏继续前进的灯!
【解决方案2】:

如果您使用的是 Ruby 2.4 或更高版本,则只需执行 arr.sum 即可找到仅包含数字的数组的总和。

https://ruby-doc.org/core-2.4.0/Array.html#method-i-sum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多