经过4天的阅读和研究,在数学和计算机科学图书馆在我的地方和在线阅读,我真的很茫然,需要一些明确的简单外行的见解,我手头的问题。
这是我的现实世界问题,然后我将表明我理解这个问题,但不知道如何将其转化为一个c mvc5解决方案。
问题:
我已经建立了一个c mvc 5解决方案,从一个新的订单建立托盘。我已经完成了订单,并创建了一个列表,列出了所有订购到完整货盘或部分货盘的物品。然后我拿部分货盘清单,看看什么小于2800磅,看看我如何才能把一个混合货盘放在一起,总重量达到2800磅。我做得很好,把货盘分开,总重量达到2800磅。然而,这是伟大的运输效率,但这不是客户友好的,不应该分开。
从这里开始我就被困在这里了。我被告知要采取部分托盘清单和任何一组托盘得到最接近2800磅把所有这些放在一起,然后下一组(或剩余)继续下一个托盘高达2800。
然后我开始研究这种算法的类型,我知道这是一个子集和问题。我看到了无数的堆栈溢出的帖子,指向wiki页面,我不得不告诉你,我不是数学家,不知道如何把这变成一个真正的解决方案。
以下是我目前已知的参数。
混合托盘应为2800磅。
货物清单可以放在一个混合托盘上,至少2件,但我认为不能超过20件(全部取决于货物重量或货物类型)
下面是当前演示的权重列表
2575,92,1200,640
接近2800磅的最佳组合是什么?把它们从列表中去掉,那么2800磅的下一个最佳组合是什么?
这是我第一次着手解决这个问题

   using System;

   namespace TwoElementsWhoseSumIsClosestToZero
   {
    class Program
    {
        static void Main(string[] args)
        {
            var integerArray = new int[] { 2575, 92, 1200, 640 };
            maxAbsSumPairs(integerArray, 4);

        }

        static void maxAbsSumPairs(int[] arr, int arrsize)
        {
            var sum = int.MaxValue;
            var minSum = int.MaxValue;
            var l = 0;
            var r = arrsize - 1;
            var minl = l;
            var minr = arrsize - 1;

            if (arrsize < 2)
            {
                Console.WriteLine("Invalid Input");
                return;
            }

            Array.Sort(arr, l, r);

            while (l < r)
            {
                sum = arr[l] + arr[r];

                if (Math.Abs(sum) < Math.Abs(minSum))
                {
                    minSum = sum;
                    minl = l;
                    minr = r;
                }
                if (sum < 2800)
                {
                    l++;
                }
                else
                {
                    r--;
                }
            }
            Console.WriteLine(" The two elements whose sum is minimum are {0} and {1}", arr[minl], arr[minr]);
            Console.ReadLine();
        }
    }
}

我哪里做错了?

最佳答案

以下是与我在上述评论中的解释相关的代码:
“我认为最好的方法是根据权重按降序排列数组(所以[25751200 64092])。从最重的开始,然后尝试添加下一个,除非它超过2800如果是,继续向下移动列表,直到找到一个合适的。如果列表中没有合适的货物,或者您已经达到20件,那么托盘就完成了再重复一遍”
我不能保证它没有bug,但当我扩展输入数组时,它似乎也能工作。我相信这样做会更有效率。欢迎提出建议。

using System;
using System.Linq;
using System.Collections.Generic;

namespace palletSorter
{
class MainClass
{
    public static void Main(string[] args)
    {

        var integerArray = new int[] { 2575, 92, 1200, 640, 290, 730, 50, 23, 500};

        CreateBestPallets(integerArray);

    }

    private static void CreateBestPallets(int[] items)
    {

        var sortedItems = items.OrderByDescending(c => c).ToList();



        while (sortedItems.Count > 0)
        {
            var totalWeight = 0;
            var pallet = new List<int>();
            var removedItems = new List<int>();

            foreach (var item in sortedItems)
            {
                if (pallet.Count == 20)
                    break;

                if ((totalWeight + item) < 2800)
                {
                    totalWeight += item;
                    pallet.Add(item);
                    removedItems.Add(item);
                }
            }

            foreach (var item in removedItems)
            {
                sortedItems.Remove(item);
            }

            var printString = "";
            foreach (var item in pallet)
            {
                printString += item + ",";
            }

            Console.WriteLine("Pallet Combination: " + printString + "\tTotal Weight: " + totalWeight);
        }

    }

}
}

下面是示例输出(展开数组):
托盘组合:2575,92,50,23,总重量:2740
托盘组合:1200730640,总重量:2570
托盘组合:500290,总重量:790
-
示例输出(原始数组):
托盘组合:2575,92,总重量:2667
托盘组合:1200640,总重量:1840

07-25 23:49