从Array中有效选择值

时间:2016-05-02 09:18:26

标签: c#

我有一个包含一些值的数组,比如

  • 250
  • 500
  • 1000
  • 2000

示例:

我想根据询问量混合牛奶。 有人问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毫升

溢出是一样的。

0 个答案:

没有答案