c# - 将一个整数表示为其他一些固定整数的总和

标签 c# .net algorithm

我有一个固定的权重列表:

int[] weights = new int[] { 10, 15, 20 };

和一个目标:

int target = 28;

我正在寻找一种算法来将 target 表示为 weights 中元素的总和(允许重复),这样 target 要么匹配或超过,实现与目标最接近的匹配,并且在其中,使用的权重数量被最小化。

因此,对于上述输入,我希望返回 10 2015 15,因为 30 尽可能接近得到,在制作30的选项中,这两个比10 10 10好。

对于 39target,输出应该是 20 20 而不是 15 15 1010 10 10 10

target14,输出应为 15

除了常规的 foreach 循环之外,这里还有什么好的方法吗?我正在考虑检索数组中可用的最大值并检查目标是否为负数,如果不是则让我们寻找下一个值。

这不是作业:)

最佳答案

这被称为 knapsack problem .唯一的区别是您正在寻找最近 匹配,而不是最近较低 匹配。同样幸运的是,没有一个权重具有不同的值。困难在于您不能简单地使用最接近的 权重 之一并使用剩余值递归(较小值的组合有时会更好地匹配)。

在您的示例中,权重 之间都有 5 个“单位”,如果始终如此,问题将变得更容易解决。

关于c# - 将一个整数表示为其他一些固定整数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11409361/

相关文章:

游戏 Ruzzle 中使用的算法

c# - WMEncoder 在一次迭代后抛出 OutOfMemoryException

c# - 对 DBNull 的评估检查不起作用

c# - 如何在没有数据库的情况下在 C# 中填充 DropDown 中的状态列表

c# - Dispose() 如何在我的 Controller 和 Repository 类中工作

algorithm - AStar - 名称解释

c# - Xamarin 项目在 Visual Studio 2015 中不可用

c# - 异步函数和 BitArmory ReCaptcha 的问题

c# - 制作自动运行应用程序的最佳解决方案?

algorithm - 学生积木组合设计