C#中Array.Sort报1503错误:无法转换为IComparer的解决方法
修复贪心背包算法的1503错误
错误原因
你遇到的1503错误是Array.Sort抛出的ArgumentException,根源在于:
- 数组初始化错误:
weights和values的长度被错误设置为data.Length - 1,但实际每个物品对应data中的两个元素(重量+价值),导致数组中存在大量未赋值的0元素。计算valuePerWeight时会出现0/0的情况,产生NaN值,而Array.Sort无法对包含NaN的数组排序,触发错误。 - 循环赋值逻辑问题:原循环中使用
++i导致索引跳跃,若输入数据格式不符合“容量+成对重量价值”的规则,还可能引发数组越界。
修复步骤
1. 修正数组长度与赋值逻辑
在Main方法中,正确计算物品数量并初始化数组,调整循环赋值方式:
static void Main(string[] args) { int[] data = ReadDataFromFile("items.txt"); // 校验数据格式:容量后必须是成对的重量和价值,总长度应为奇数 if ((data.Length - 1) % 2 != 0) { Console.WriteLine("数据格式错误:物品必须以「重量-价值」成对出现"); return; } int capacity = data[0]; int itemCount = (data.Length - 1) / 2; // 正确计算物品数量 int[] weights = new int[itemCount]; int[] values = new int[itemCount]; // 循环赋值,避免索引跳跃 for (int i = 0; i < itemCount; i++) { weights[i] = data[1 + 2 * i]; values[i] = data[2 + 2 * i]; } // 后续代码不变 int[] selectedItems = GreedyKnapsack(capacity, weights, values); int totalValue = 0; Console.WriteLine("Selected items:"); for (int i = 0; i < selectedItems.Length; i++) { if (selectedItems[i] == 1) { Console.WriteLine($"Weight: {weights[i]}, Value: {values[i]}"); totalValue += values[i]; } } Console.WriteLine($"Total value: {totalValue}"); }
2. 避免除以0的情况
在GreedyKnapsack方法中,添加对重量为0的物品的处理,防止产生NaN:
static int[] GreedyKnapsack(int capacity, int[] weights, int[] values) { int n = weights.Length; int[] selected = new int[n]; double[] valuePerWeight = new double[n]; for (int i = 0; i < n; i++) { if (weights[i] == 0) { // 重量为0的物品直接赋予最高优先级(不占容量) valuePerWeight[i] = double.MaxValue; } else { valuePerWeight[i] = (double)values[i] / weights[i]; } } Array.Sort(valuePerWeight, weights, values); int weight = 0; for (int i = n - 1; i >= 0; i--) { if (weight + weights[i] <= capacity) { selected[i] = 1; weight += weights[i]; } } return selected; }
额外说明
- 确保
items.txt格式正确:第一行是背包容量,之后每两个元素对应一个物品的重量和价值(如capacity w1 v1 w2 v2...)。 - 修正后,
weights和values数组长度一致且无冗余0元素,valuePerWeight不会出现NaN,Array.Sort可正常执行。
内容的提问来源于stack exchange,提问作者deadangel13
相关产品推荐
相关产品推荐

