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

List<Long>转int丢失精度:动态规划代码报错求助

解决long转int的类型不兼容问题

看起来你遇到的问题是数组索引的类型不匹配,编译器报错的核心原因是:你用了long类型的变量作为int类型的数组索引,Java不允许隐式地把long转成int(因为可能丢失精度)。咱们一步步拆解问题:

错误根源分析

你的代码里有两个关键问题:

  1. 内层循环的i是long类型,但dp数组的长度是n+1(n是int),数组索引必须是int类型。当你写dp[i]或者dp[i - coin]时,i和i-coin都是long,编译器认为这是“可能损失精度的转换”,所以报错。
  2. coin是Long类型,和long类型的i比较没问题,但计算索引时依然会产生long类型的结果,无法直接作为数组索引。

修复方案

因为n是int类型,内层循环的i取值范围是1到n,完全在int的范围内,所以直接把i改成int类型就解决了大部分问题。另外,当i >= coin时,coin的数值必然小于等于i(也就是小于等于n,int范围),所以可以安全地处理coin的类型转换:

修改后的代码如下:

public static long count(int n, List<Long> c) {
    long[] dp = new long[n + 1];
    dp[0] = 1;
    for (long coin : c) {
        // 把coin转成int,因为当i >= coin时,coin <= i <=n(int范围),不会溢出
        int coinInt = coin.intValue();
        // 内层循环的i改成int类型
        for (int i = 1; i <= n; i++) {
            if (i >= coinInt) {
                dp[i] += dp[i - coinInt];
            }
        }
    }
    return dp[n];
}

额外说明

如果担心coin的数值可能超过int的范围(虽然题目里n是int,超过的话i >= coin永远不成立,不会进入分支),也可以用另一种方式处理,不需要提前转coin,而是在计算索引时强制转换:

public static long count(int n, List<Long> c) {
    long[] dp = new long[n + 1];
    dp[0] = 1;
    for (long coin : c) {
        for (int i = 1; i <= n; i++) {
            if ((long)i >= coin) {
                // 因为i >= coin,所以i - coin是非负的,且数值在int范围内,强制转换安全
                dp[i] += dp[(int)(i - coin)];
            }
        }
    }
    return dp[n];
}

两种方式都能解决你的报错问题,第一种更直观,第二种避免了提前转换的步骤,你可以根据习惯选择。

内容的提问来源于stack exchange,提问作者d.r.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:20:25