我的舒适语言是Java,但最近我决定学习C ++语法。
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++){
if(Wt[i] <= j) {
V[i][j] = std::max(V[i-1][j], Va[i]+V[i-1, j- Wt[i]]);
} else {
V[i][j] = V[i-1][j];
}
}
}
return V[N][totW];
}
这是我对01背包的实现。但是,我在行中收到错误:
V[i][j] = std::max(V[i-1][j], Va[i]+V[i-1, j- Wt[i]]);
错误如下:
没有重载函数的实例“std :: max”匹配参数列表 - 参数类型是:(int,int *)
我的问题是,为什么Va[i]
会返回指针,而V[i-1][j]
却没有?
答案 0 :(得分:3)
V[i-1, j- Wt[i]]
不是你在C ++中访问二维数组的方式。事实上,没有原始的二维数组,只有数组的数组(V
是什么)。您总是需要连续几次访问[]
。
该表达式中的,
(在其他表达式中并不代表其他内容)是comma operator,它评估然后丢弃其左操作数。所以你的代码试图做的是:
i-1
,然后丢弃结果。j-Wt[i]
,然后访问V[j-Wt[i]]
。那不是你想要的。