找零钱的最小硬币数量和无解情况

我需要帮助给我的找零钱程序添加一个 if 语句,以便在有些情况下,整数面额不能等于硬币面额时返回“Change Not Possible”。例如,我有 2、4、6 分值的硬币,但我需要找的零钱是 1 分,那么我希望它能够返回“Change Not Possible”。我试图添加下面的条件语句,但是当我测试时,它返回了 1.#INF。 此外,我还想知道如何找到最优的解法,以便除了返回最小硬币数量之外,还返回最优的硬币组合 (如果有的话)。

function ChangeMaking(D,n)
--[[
//使用动态规划来找到面额为 d1< d2 <. . . < dm(其中 d1 = 1)的最小硬币数量,它们加起来等于给定的金额 n
//输入:正整数 n 和数组 D[1..m],其中 D[1] = 1,用于表示硬币面额
//输出:加起来等于 n 的最小硬币数量
]]
  F = {} -- F 是硬币列表的数组
  m = tablelength(D)
  F[0] = 0
  for i =1,n do
    temp = math.huge
    j = 1
  while j <= m and i >= D[j] do
    temp = math.min(F[ i - D[j] ], temp)
    j = j + 1
  end
  F[i] = temp + 1
  end
  --我想在这里检测失败的情况,但是我返回了 1.#INF
  --如果 F[n] <= 0 并且 F[n] == 1.#INF,则打印“无解”并返回
  --if F[n] <= 0 and F[n] == 1.#INF then print("No Change Possible") return end
  return F[n]
end

function main()

--[[
//打印问候语,请求用户输入由空格分隔的硬币面额
//遍历输入并将值分配给表格
//然后将表格输入到 ChangeMaker 中,while 循环接受用户输入的 n 值。
// 用户输入 0 结束循环
]]

  io.write("欢迎使用找零钱程序 - LUA 版本\n请输入一系列找零钱面额,由空格分隔: ")
  input = io.read()
  deno = {}
  for num in input:gmatch("%d+") do table.insert(deno,tonumber(num)) end
  local i = 1
  while i ~= 0 do
    io.write("请输入找零钱的总额,输入 0 结束: ")
    input2 = io.read("*n")
    if input2 ~= 0 then io.write("\n最小硬币数量: " .. ChangeMaking(deno,input2).."\n") end
    if input2 == 0 then i=0 print("输入了 0,退出找零钱程序") end
  end
end
function tablelength(T)
--[[
//获取表格的总长度的函数
]]
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

main()
点赞