Algorithm 查找集合中与小于n的n最接近的数字相加的数字

Algorithm 查找集合中与小于n的n最接近的数字相加的数字,algorithm,vector,sum,Algorithm,Vector,Sum,基本上我得到了一个数字向量和一个目标数字,目标是找到数组中与n最接近的数字,小于n,我应该能够在向量中多次使用相同的数字 例如: {4,3},目标:10 在这种情况下,它应该返回一个包含3,3,4的向量,因为它们的和是10 {60,30},目标:135 在这种情况下,它应该返回一个包含60、60或30、30、30、30的向量,因为这些向量的和是与目标可能的最接近的和,而它仍然小于目标 如何在现代C++中实现该算法? 我尝试过修改我想要的解决方案,但我陷入了一个困境,它使用了递归,我找不到一种方法

基本上我得到了一个数字向量和一个目标数字,目标是找到数组中与n最接近的数字,小于n,我应该能够在向量中多次使用相同的数字

例如:

{4,3},目标:10

在这种情况下,它应该返回一个包含3,3,4的向量,因为它们的和是10

{60,30},目标:135

在这种情况下,它应该返回一个包含60、60或30、30、30、30的向量,因为这些向量的和是与目标可能的最接近的和,而它仍然小于目标

如何在现代C++中实现该算法?


我尝试过修改我想要的解决方案,但我陷入了一个困境,它使用了递归,我找不到一种方法来检查一个解决方案是否比算法找到的上一个更好。

如果
vec
中的所有数字都保证为正,那么可以使用递归轻松地解决这个问题

solve(vec, target, currentSum, solution)
  if currentSum > target
    return
  if currentSum == target
    print(solution)
    return
  for value in vec
    solve(vec, target, currentSum + value, solution + value)
你从

solve({4, 3}, 10, 0, {})
solution+value
附加和
currentSum+value
添加


下一步是找到一种迭代方法并添加备忘录

您尝试了什么?你在哪里卡住了?请展示一个我尝试过修改这个解决方案的例子:我想要什么,但是我被困在了一个点上,它使用了一个递归,我找不到一种方法来检查一个解决方案是否比算法找到的上一个更好。请花些时间来进行SO,read,以及。当然,请学习如何回答你的问题。如果你用C++和C++ 11来标记你的问题,你应该问一些关于C++的事情或者显示一些C++代码。否则这些标签在这里就没有意义了。“我怎么能在现代C++中实现这个算法?”你不使用编程语言来生成算法。算法与语言无关。要么你没有算法,而这只是一个算法问题(与C++无关),要么你有一个完整的算法,那么你应该在问题中描述它。在这两种情况下,你都应该提供你的方法。@ ThomasSablik主要是一个算法问题,但是我想在C++中实现这个算法。