C ++ Почему доступ к элементам в массиве возвращает указатель? - PullRequest
0 голосов
/ 23 мая 2018

Мой комфортный язык - 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] нет?

1 Ответ

0 голосов
/ 23 мая 2018

V[i-1, j- Wt[i]] - это не то, как вы получаете доступ к двумерному массиву в C ++.На самом деле не существует такой вещи, как примитивный двумерный массив, только массивы массивов (вот что такое V).Вам всегда нужно обращаться к ним с помощью нескольких последовательных [].

. * В этом выражении (и в других выражениях, где это не означает что-то еще) есть оператор запятой , которыйоценивает и затем отбрасывает свой левый операнд.Итак, ваш код пытается сделать следующее:

  1. Вычислить i-1, затем отбросить результат.
  2. Вычислить j-Wt[i] и затем получить доступ к V[j-Wt[i]].Это не то, что вы хотели.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...