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