PACKING 문제 관련 질문드립니다!

  • chochogogo
    chochogogo

    안녕하세요??
    PACKING 문제 관련 질문드립니다!

    일단 문제 풀이 알고리즘은
    solving(stuffIdx, leftVolumeOfBag) //해당 물건의 인덱스가 stuffIdx이라 할때, stuffIdx 이후 물건들 고려(남은 용량이 leftVolumeOfBag)했을 때, 최대 절박도라 정의 하였으며,
    이는 해당 물건을 고른 경우와, 고르지 않은 경우를 나누어
    이중 최대값을 선택하는 식으로 구현하였습니다.

    제 알고리즘이 잘못된줄 알고, 종만북 참조해 보니...
    제 코드와 거진 유사하더라구요....

    혹시나 문자열 출력시, 널문자 출력해서 오답 내나 봤더니 그것도 아니고... 최대 절박도와 선택된 물건 개수 사이에 공백 들어가서 오답인줄 알고 그 처리도 해봤는데 오답 나더라구요...

    혹시 제 코드, 알고리즘에 어떤 잘못된 점이 있는지 조언 부탁드립니다.

    감사합니다!

    #include <stdio.h>
    
    #define MAX(x, y) (x)>(y)?(x):(y)
    
    typedef struct _stuffInfo{
        char name[25];
        int volume;
        int howMuchNeeded;
    }StuffInfo;
    
    int N, W;
    StuffInfo stuff[105];
    int cache[105][1005];
    int selectedStuffIdx[105];
    int selectedStuffCnt;
    
    void init(void);
    void input(void);
    void solve(void);
    int solving(int stuffIdx, int leftVolumeOfBag);
    void findSelctedStuff(int stuffIdx, int leftVolumeOfBag);
    
    int main(void)
    {
        int tc, T;
        //freopen("input.txt", "r", stdin);
        scanf("%d", &T);
    
        for (tc = 1; tc <= T; tc++)
        {
            input();
            init();
            solve();
        }
    
        return 0;
    }
    
    void init(void)
    {
        selectedStuffCnt = 0;
        for (int i = 0; i <= N; i++)
        {
            for (int j = 0; j <= W; j++)
                cache[i][j] = -1;
        }
    }
    
    void input(void)
    {
        scanf("%d%d", &N, &W);
        for (int i = 1; i <= N; i++)
            scanf("%s%d%d", stuff[i].name, &stuff[i].volume, &stuff[i].howMuchNeeded);
    }
    
    void solve(void)
    {
        int howMuchNeededMaxValue = 0;
    
        howMuchNeededMaxValue = solving(0, W);
        findSelctedStuff(0, W);
    
        printf("%d %d\n", howMuchNeededMaxValue, selectedStuffCnt);
        for (int i = 0; i < selectedStuffCnt; i++)
        {
            for (int j = 0; stuff[selectedStuffIdx[i]].name[j] != 0; j++)
                    printf("%c", stuff[selectedStuffIdx[i]].name[j]);
            puts("");
        }
    }
    //stuffIdx 이후 물건들 고려(남은 용량이 leftVolumeOfBag)했을 때, 최대 절박도
    int solving(int stuffIdx, int leftVolumeOfBag)
    {
        //기저 사례
        if (N == stuffIdx)
            return 0;
    
        int& ret = cache[stuffIdx][leftVolumeOfBag];
    
        if (ret != -1)
            return ret;
    
        ret = solving(stuffIdx + 1, leftVolumeOfBag);
        //가방 보다 부피 커지는 것 넣으면 안됨 + 물건이 1개인 경우, 해당 물건의 부피가 가방의 부피보다 큰 경우 0 찍어 줘야 함.
        if (leftVolumeOfBag - stuff[stuffIdx].volume >= 0)
            ret = MAX(ret, solving(stuffIdx + 1, leftVolumeOfBag - stuff[stuffIdx].volume) + stuff[stuffIdx].howMuchNeeded);
    
        return ret;
    }
    
    void findSelctedStuff(int stuffIdx, int leftVolumeOfBag)
    {
        if (stuffIdx == N)
            return;
    
        if (solving(stuffIdx, leftVolumeOfBag) == solving(stuffIdx + 1, leftVolumeOfBag))
            findSelctedStuff(stuffIdx + 1, leftVolumeOfBag);
        else
        {
            selectedStuffIdx[selectedStuffCnt] = stuffIdx;
            selectedStuffCnt += 1;
            findSelctedStuff(stuffIdx + 1, leftVolumeOfBag - stuff[stuffIdx].volume);
        }
    }
    

    8년 전
2개의 댓글이 있습니다.
  • rlakim5521
    rlakim5521

    저도 PACKING에서 계속 오답이 나네요. 테스트 케이스도 잘 통과하고 추가로 제가 만든 케이스들도 다 답을 내는데 말이죠.


    8년 전 link
  • chochogogo
    chochogogo

    ㅠㅠ 무엇이 문제일까요??ㅠㅠ


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