packing 문제좀 봐주세요. 왜 틀렸는지 모르겠어요 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 우선 테스트 케이스별로 출력을 미리 하셔도 됩니다. 즉, 따로 ans 배열을 선언하시는 등의 일을 안하셔도 됩니다. 초기화가 잘못 된 것 같습니다. j가 W까지 돌아야 하는 것 같네요. name 배열은 왜 int인가요? 아마도 추적 알고리즘에 문제가 있는 것 같은데... 오래 볼 시간이 없어서 문제점은 못찾겠네요 ㅠㅠ 8년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
mars37
예제 답도 잘 나오고하는데 오답으로 나오니 맨붕이네요.
아래 코드에서 어디가 잘못되었는지 못찾겠습니다.ㅠ
8년 전