Ошибка в коде ранца 0-1. В чем ошибка в моем коде? - PullRequest
0 голосов
/ 24 февраля 2020

Я решал эту проблему в Geeksforgeeks в части практики, но этот код терпит неудачу где-то я не понимаю

 #include <iostream>
 using namespace std;

int main() {
//code
int T,N,W;
cin>>T;//The number of test cases
while(T-->0){
    cin>>N>>W;//N for number of items and W for capacity
    int dyna[N+1][W+1] = {{0,0}};//table to store values
    int val[N+1],wt[N+1];//val stores value and wt for weight
    for(int i = 1;i <= N;i++)cin>>val[i];
    for(int i = 1;i <= N;i++)cin>>wt[i];
    for(int i = 0;i <=N;i++){
        for(int j = 0;j <= W;j++){
            if(i==0||j==0)dyna[i][j]=0;
            else if(wt[i]<=W)
                dyna[i][j] = max(dyna[i-1][j],val[i]+dyna[i-1][j-wt[i]]);
            else
                dyna[i][j] = dyna[i-1][j];
        }
    }
    cout<<dyna[N][W]<<endl;
}
return 0;
}

1 Ответ

0 голосов
/ 24 февраля 2020

Например, у вас есть отдельные длины N и W, которые избыточны, так как они всегда должны быть равны. Я думаю, что проблема, которую вы наблюдаете, связана с вашим else if. Вы проверяете, меньше ли текущий вес, чем количество предметов, что на самом деле не имеет смысла. Вероятно, это должно быть что-то вроде else if(j-wt[i]>=0), поскольку вы пытаетесь определить, можете ли вы вычесть текущий вес wt[i] из текущей суммы j и получить действительный (в границах) результат. Я предполагаю, что вы получаете segfault или подобное, потому что вы пытаетесь получить доступ к dyna[i-1][j-wt[i]], когда, например, i и j равны 1, а wt[i] равно 10, поскольку dyna[0][-9] является (вероятно) неразделенной памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...