C# 试图在没有多维数组的情况下解决背包问题

C# 试图在没有多维数组的情况下解决背包问题,c#,dynamic-programming,knapsack-problem,C#,Dynamic Programming,Knapsack Problem,我正在尝试自己实现背包算法,我想知道它是否可以在没有多维数组的情况下实现,这是我在网上看到的最多的 我的想法并不是要做一个最理想的,所以我只是使用我认为可以完成工作的方法。(使用列表而不是int[]) 我觉得我已经接近成功了,但还没有完全成功,我也不确定我做错了什么 下面由一个驱动程序函数提供,该函数解析如下输入(权重:值): 马克斯 五十 10:60,20:100,30:120 应该打印220,以及创建它的子集 如果添加的值小于或等于最大权重,则校验和返回true 虽然,一半的代码只是获取和放

我正在尝试自己实现背包算法,我想知道它是否可以在没有多维数组的情况下实现,这是我在网上看到的最多的

我的想法并不是要做一个最理想的,所以我只是使用我认为可以完成工作的方法。(使用列表而不是int[])

我觉得我已经接近成功了,但还没有完全成功,我也不确定我做错了什么

下面由一个驱动程序函数提供,该函数解析如下输入(权重:值):

马克斯

五十

10:60,20:100,30:120

应该打印220,以及创建它的子集

如果添加的值小于或等于最大权重,则校验和返回true

虽然,一半的代码只是获取和放置值

 public static bool Knapsack(int W, Dictionary<int, Tuple<int,int>> Items, List<int> numbers)
    {
        List<int> summationValue;
        List<int> subset;
        List<int> summationWeight;
        List<KeyValuePair<int, List<int>>> finalSet = new List<KeyValuePair<int, List<int>>>();

        for (int auto = 0; auto <= Items.Count-1; auto++)
        {
            Console.WriteLine("Iteration: " + auto);
            int value1 = Items[auto].Item2;
            int weight1 = Items[auto].Item1;
            summationValue = new List<int> { value1 };
            subset = new List<int> { (auto+1) };
            summationWeight = new List<int> { weight1 };
            //Initialize//var currentItem = itemIndex == 0 ? null : items[itemIndex - 1];
            for (int other_nodes = 0; other_nodes <= Items.Count-1; other_nodes++)
            {
                if (other_nodes == auto)
                {
                    other_nodes++;
                }
                int value2 = Items[other_nodes].Item2;
                int weight2 = Items[other_nodes].Item1;
                if (CheckSum(summationWeight, weight2, W))
                {
                    summationValue.Add(value2); 
                    subset.Add(other_nodes+1);
                    summationWeight.Add(weight2);
                    KeyValuePair<int, List<int>> kv = new KeyValuePair<int, List<int>>(summationValue.Sum(), subset);
                    finalSet.Add(kv);
                    break;
                }



            }

            //After all item iteration, print outputs; [Highest value] [Subset] [Weight]
            string printValue = summationValue.Sum().ToString();
            subset.Sort();
            string printWeight = summationWeight.Sum().ToString();

            Console.WriteLine("Highest Value: ");
            Console.WriteLine(printValue);
            Console.WriteLine("Subsets: \n");
            Console.Write("{ ");
            foreach (var i in subset)
            {
                 Console.Write(i + " ");
            }
            Console.WriteLine("}");
            Console.WriteLine("Highest Weight: ");
            Console.WriteLine(printWeight);
        }
        Console.WriteLine("[========================]");
        var pair = finalSet.OrderByDescending(x => x.Key).First();
        var keys = finalSet.Where(kvp => kvp.Key == pair.Key).Select(kvp => kvp.Key).ToArray();
        var fkey = keys.Max();
        Console.WriteLine(fkey);
        Console.Write("{ ");
        foreach (var i in pair.Value)
        {
            Console.Write(i + " ");
        }
        Console.Write("}");
        return true;
    }
我知道这不是最好的解决方法,但我仍然想问一下,在实现过程中我做错了什么


目前,它将打印最后一集:180,13。当它应该是220时。

多维数组有两种选择:1。锯齿状阵列。就我个人而言,我更喜欢它们而不是多维的。2.对于一个基本的1D数组,将所有索引合并成一个索引,这将非常长。将国际象棋/跳棋棋盘计算为100个方格,而不是10x10个方格。多维数组有两种选择:1。锯齿状阵列。就我个人而言,我更喜欢它们而不是多维的。2.对于一个基本的1D数组,将所有索引合并成一个索引,这将非常长。将国际象棋/跳棋棋盘计算为100格,而不是10x10格。
 finalSet.OrderByDescending(x => x.Key).First();