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

C++数组元素访问为何返回指针?01背包代码报错咨询

问题分析与解决

嘿,我来帮你搞清楚这个问题~你误会啦,Va[i]并没有返回指针,错误的根源是你访问二维数组V的语法写错了!

错误的核心原因

看你出错的这行代码:

V[i][j] = std::max(V[i-1][j], Va[i]+V[i-1, j- Wt[i]]);

这里的V[i-1, j- Wt[i]]是C里的错误写法!在C中,二维数组的访问必须用双层方括号V[row][col],而不是用逗号分隔。

你写的V[i-1, j- Wt[i]]里的逗号是逗号运算符,它的作用是:先执行逗号左边的表达式i-1(结果会被丢弃),然后执行右边的j - Wt[i],最后返回右边的值。所以这行代码等价于V[j - Wt[i]]——而V是二维数组,V[x]会返回指向第x行的指针(因为二维数组本质是“数组的数组”),这就导致Va[i] + 指针的结果是一个int*类型,而V[i-1][j]是int类型,std::max要求两个参数类型一致,自然就报出了类型不匹配的错误。

为什么V[i-1][j]没问题?

V[i-1][j]是正确的二维数组访问方式:

  • 先通过V[i-1]获取到二维数组的第i-1行(这是一个一维数组)
  • 再通过[j]访问该行的第j个元素,得到的是int类型,和std::max的另一个参数类型匹配,所以不会报错。

额外的小问题修正

另外,你的代码还有个潜在的数组越界问题:因为Wt和Va的索引是从0开始的,但循环里i从1到N,直接用Wt[i]和Va[i]会访问到数组的第N个元素(超出了数组的有效范围0~N-1),应该改成Wt[i-1]和Va[i-1]。

修正后的代码片段

int ks(int Wt[], int Va[], int N, int totW){ 
    if(N==0){ 
        return 0; 
    } 
    int V[N+1][totW+1]; 
    for(int i = 0; i < N+1; i++){ 
        V[i][0] = 0; // fill first row with 0's 
    } 
    for(int i = 0; i < totW+1; i++){ 
        V[0][i] = 0; // fill first column with 0's 
    } 
    for(int i = 1; i < N+1; i++){ 
        for(int j = 0; j < totW+1; j++){ 
            // 修正二维数组访问方式,同时调整Wt和Va的索引
            if(Wt[i-1] <= j) { 
                V[i][j] = std::max(V[i-1][j], Va[i-1] + V[i-1][j - Wt[i-1]]); 
            } else { 
                V[i][j] = V[i-1][j]; 
            } 
        } 
    } 
    return V[N][totW]; 
}

内容的提问来源于stack exchange,提问作者FelixTheCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:15