我现在已经坚持这个问题已经8个星期了,我认为我几乎有一个解决方案但是数学的最后一点是绞尽脑汁。我将尝试解释一个需要复杂解决方案的简单问题。我在C#.net MVC Web项目中编程。情况就是这样。
我有一组未知的数量来寻找类似物品。那些像项目共享一个最大级别,使其成为一个完整的盒子。这是一个例子:
修订****** 这是现实世界的案例 我有许多,比如糖果,订单进入公司。
Qty Item MaxFill Sold-To DeliverNumber
60 candy#14 26 Joe 1
1 candy#12 48 Jim 2
30 candy#11 48 Jo 3
60 candy#15 48 Tom 4
6 candy#8 48 Kat 5
30 candy#61 48 Kim 6
44 candy#12 48 Jan 7
10 candy#12 48 Yai 8
10 candy#91 48 Jun 9
55 candy#14 26 Qin 10
30 candy#14 26 Yo 11
40 candy#14 26 Moe 12
在这个列表中,我正在寻找像糖果项目组合起来制作所有可以基于MaxFill编号的糖果盒。在这里,我们看到类似的项目是:
Qty Item MaxFill Sold-To DeliverNumber
60 candy#14 26 Joe 1
55 candy#14 26 Qin 10
30 candy#14 26 Yo 11
40 candy#14 26 Moe 12
1 candy#12 48 Jim 2
44 candy#12 48 Jan 7
10 candy#12 48 Yai 8
现在让我们为糖果#14获取第一组数字。
我知道#14的糖果总数是185,我可以得到7个满箱的26个,一个盒子在最后一个盒子里只有3个。那么我如何使用我拥有的值来做到这一点而不会丢失原始订单的信息。所以这就是我现在正在解决的问题
见下文 修订版本结束****** 像糖果#14最大填充水平是26。
喜欢糖果#14数量: 60 55 三十 40
现在我已经有一个递归函数将它们分解到26级并且工作正常。我觉得我需要另一个递归函数来处理由此产生的余数。正如你所看到的那样,大部分时间都会有任何给定列表中的剩余部分,但这些剩余部分总共可以达到26个。
60 = 26+26+8
55 = 26+26+3
30 = 26+4
40 = 26+14
8,3,4,14 = 29所以我可以得到另外26个。但是在真正未知的世界里,我可以让剩余的人想出一套可以重复同样情况的新的剩余物。为了使这更复杂,我必须保存与其一起携带的60,55,30,40的原创数据,例如销售给谁和交货号。这也有助于了解原始数量如何分解并组合在一起。
从8,3,4,14开始,我认为最好的方法是加上8,4,14,这将给我26我想要的,我不需要拆分任何值因为3是余数,我可以保存所有其他数据而不会出现问题。然而,这只适用于这种情况。如果我进行8 + 3 + 4 = 15的线性运动,那么我必须从下一个值14中取11,余数为3。在阅读不同的算法时,我认为这可能属于NP,NP-Complete,NP-Hard类别。但是在所有情况下,它都是非常技术性的,并且不会发现很多真实场景。
如果我应该查看数字列表以找到达到26的最佳组合,或者如果线性进展和下一个值的分割是最佳解决方案,那么任何建议都会对此有所帮助。我知道我可以解决从遗留物中得到多少完整的盒子以及剩下的剩余量如8 + 3 + 4 + 14 = 29这会给我1,26和1,3但我我不知道以递归的方式解决这个问题。我已经完成了这么多工作,并且“感觉”这是在正确的轨道上,但无法看到如何进行调整以使其与线性工作或“测试每种可能的组合”。
public static void Main(string[] args)
{
var numbers = new List<int>() { 8, 3, 4, 14 };
var target = 26;
sum_up(numbers, target);
}
private static void sum_up(List<int> numbers, int target)
{
sum_up_recursive(numbers, target, new List<int>());
}
private static void sum_up_recursive(List<int> numbers, int target, List<int> partial)
{
int s = 0;
foreach (int x in partial) s += x;
if (s == target)
{
var outputtext = "sum(" + string.Join(",", partial.ToArray()) + ")=" + target;
}
if (s >= target)
return;
for (int i = 0; i < numbers.Count; i++)
{
List<int> remaining = new List<int>();
int n = numbers[i];
for (int j = i + 1; j < numbers.Count; j++) remaining.Add(numbers[j]);
List<int> partial_rec = new List<int>(partial);
partial_rec.Add(n);
sum_up_recursive(remaining, target, partial_rec);
}
}