packing 문제좀 봐주세요. 왜 틀렸는지 모르겠어요

  • mars37
    mars37

    예제 답도 잘 나오고하는데 오답으로 나오니 맨붕이네요.
    아래 코드에서 어디가 잘못되었는지 못찾겠습니다.ㅠ

    #include <stdio.h>
    #define LM 1004
    
    int wi[104];
    int pi[104];
    int D[104][LM];
    int path[104][LM];
    
    int Max(int a, int b){if (a>b)return a; return b;}
    int abs(int a) {if(a<0)return -a;return a;}
    
    int ans[54][2];
    int idx[54][104];
    int name[54][104][34];
    
    int main(){ 
       int C;   
       scanf("%d", &C); 
       for(int t = 1; t <= C; t++){     
           int N, W;        
           scanf("%d %d", &N, &W);      
    
           for(int i=0; i<=N; i++){
              for(int j=0; j<=W; j++){              
                  D[i][j] = 1>>25;
                  path[i][j]=-1;
              }
           }
    
           for(int i=1; i<=N; i++){         
              scanf("%s %d %d", name[t][i], wi+i, pi+i);        
           }        
    
           for(int i=1; i<=N; i++){         
              for(int j=0; j<=W; j++){
                 if(j<wi[i]){                   
                    D[i][j] = D[i-1][j];
                    path[i][j]=-abs(path[i-1][j]);              }
                else if(j-wi[i]>=0){
                       if(D[i-1][j] > D[i-1][j-wi[i]]+pi[i]){
                       D[i][j] = D[i-1][j];
                       path[i][j]= -abs(path[i-1][j]);                 }
                    else {
                       D[i][j] = D[i-1][j-wi[i]]+pi[i];
                       path[i][j] = abs(j-wi[i]);
                    }
                 }
              }
           }
    
           int pnt = W;
           int p = 0;   
           for(int i=N; i>=1; i--){
              if(path[i][pnt]>=0){
            idx[t][p++] = i;
            pnt = path[i][pnt];
            }
           }
    
           ans[t][0]=D[N][W];
           ans[t][1]=p; 
       }
    
       for(int t=1; t<=C; t++){
           if(ans[t][0] > 0){
          printf("%d %d\n", ans[t][0], ans[t][1]);             
          for(int i=ans[t][1]-1; i>=0; i--){
             printf("%s\n", name[t][idx[t][i]]);
          }
           }
       }
    }
    

    8년 전
1개의 댓글이 있습니다.
  • Corea
    Corea
    • 우선 테스트 케이스별로 출력을 미리 하셔도 됩니다. 즉, 따로 ans 배열을 선언하시는 등의 일을 안하셔도 됩니다.
    • 초기화가 잘못 된 것 같습니다. j가 W까지 돌아야 하는 것 같네요.
    • name 배열은 왜 int인가요?
    • 아마도 추적 알고리즘에 문제가 있는 것 같은데... 오래 볼 시간이 없어서 문제점은 못찾겠네요 ㅠㅠ

    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.