PACKING 문제 뭐가 문젠지 모르겠어요...

  • yennie
    yennie
    #include <stdio.h>
    int n, w;
    char things[101][22];
    char chosen[101][22];
    int weight[101], wish[101];
    int opt[101][1001], chidx;
    int calc(int idx, int wgt) {
        if (idx == n || wgt > w) return 0;
        if (wgt + weight[idx] > w) return opt[idx][wgt] = calc(idx + 1, wgt);
        if (opt[idx][wgt] != -1) return opt[idx][wgt];
        int c1 = calc(idx + 1, wgt + weight[idx]) + wish[idx],
            c2 = calc(idx + 1, wgt);
        return opt[idx][wgt] = (c1 > c2 ? c1 : c2);
    }
    void footprint(int st, int w) {
        if (opt[st][w] <=0 || st == n) return;
        if (opt[st + 1][w] == opt[st][w]) 
            footprint(st + 1, w);
        else if (opt[st + 1][w + weight[st]] == (opt[st][w] - wish[st]))
        {
            sprintf(chosen[chidx++], "%s", things[st]);
            footprint(st + 1, w + weight[st]);
        }
    }
    int main() {
        int c; scanf("%d", &c);
        while (c--) {
            scanf("%d %d", &n, &w); chidx = 0;
            for (int i = 0; i < n; i++) {
                scanf("%s %d %d", things[i], &weight[i], &wish[i]);
                for (int j = 0; j <= w; j++) opt[i][j] = -1;
            }
            printf("%d ", calc(0, 0)); footprint(0, 0);
            printf("%d\n", chidx);
            for (int i = 0; i < chidx; i++) {
                printf("%s\n", chosen[i]);
            }
        }
    }
    

    calc는 dp로 최대 절박도를 계산하고
    footprint는 cache 따라가면서 어떤 아이템을 선택했는지 찾는건데...

    책이랑 다른 점도 없는 것 같은데 왜 자꾸 오답이 나오는지 모르겠어요...


    8년 전
1개의 댓글이 있습니다.
  • seico75
    seico75

    이런 입력은 어떨까요?

    1
    6 10
    A 1 10
    B 2 20
    C 100 100
    D 3 30
    E 4 40
    F 5 50


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