You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:25:17