我有一个包含一些值的数组,比如
示例:
我想根据询问量混合牛奶。 有人问2800毫升牛奶。
为了能够达到这个卷,我想从阵列中获得2000ml和1000ml的包。这是最有效的一个。您也可以选择6 x 500ml包装,但它的工作量更大。
逻辑是使用尽可能少的包,尽可能减少溢出。
我写了以下代码。它似乎工作,但需要更多测试。也许它不是最有效的代码,但似乎有效。任何代码优化都是受欢迎的,也无法回答我自己的问题,因为问题已经结束。
List<int> packages = new List<int>() { 250,500,1000,2000 };
//packages = new List<int>(packages.OrderByDescending(x => x));
int wantedVolume = 2800;
int leftover = wantedVolume;
List<int> selectedpackages = new List<int>();
while(true)
{
var nearest = packages.OrderBy(x => Math.Abs((long)x - leftover)).First();
selectedpackages.Add(nearest);
leftover = leftover - nearest;
if (selectedpackages.Sum() >= wantedVolume)
{
break;
}
}
Console.WriteLine("");
foreach (int i in selectedpackages)
{
Console.WriteLine("You need a package of " + i + "ml");
}
如果所需的体积为1750 ml,代码将从数组中选择2000ml包。这将减少处理,但它会溢出250毫升。有效选择为1000ml + 500ml + 250ml
如果需要的音量为2300,则会选择
2000毫升 250毫升 250毫升
但处理效率很高
2000毫升 500毫升
溢出是一样的。