packing 질문입니다(어떤 경우에 오답인지 모르겠습니다)

  • kiyeon88
    kiyeon88

    PACKING
    다이나믹프로그래밍으로 cache[from][limit]으로 메모이제이션을 써서 최대 절박도의 합을 구했고, cache에 저장된 값을 토대로 마지막에 cache[i][limit] 과 cache[i+1][limit]을 비교해가며 이용된 물건을 찾아주었습니다.
    문제의 기본 테스트 셋은 답이 잘 나왔고 그 이외에 기본 테이타셋으로 데이타가 하나인 경우 볼륨이 캐리어 용량이 클때와 작을때 모두 올바른 결과를 얻어냈구요 모든 데이타셋이 캐리어 용량보다 큰경우에 대해서도 0 0을 찍어내도록 만들었습니다. 어떤 경우에 예외사항이 있는지 모르겠네요ㅜㅜ도와주세요

    #include<iostream>
    #include<vector>
    #include<string.h>
    #include<algorithm>
    #include<string>
    #include<string.h>
    using namespace std;
    
    short cache[100][1000];
    vector<short> volume;
    vector<short> importance;
    short solve(int from, int limit){
        short& ret = cache[from][limit];
    
        if ((from == volume.size() - 1) && volume[from] <= limit) return ret = importance[from];
        if ((from == volume.size() - 1) && volume[from] > limit) return ret = 0;
    
        short minimum = volume[from];
        for (int i = from + 1; i < volume.size(); ++i)
            minimum = min(minimum, volume[i]);
        if (minimum > limit) return ret = 0;
    
        if (ret != -1) return ret;
        if (volume[from]<=limit)
            ret = importance[from] + solve(from + 1, limit - volume[from]);
        ret = max(ret, solve(from + 1, limit));
    
    
        return ret;
    
    
    }
    
    
    
    int main(){
        int cases; cin >> cases;
        while (cases--){
            int numOfItems, volumeOfCarrier;
            cin >> numOfItems >> volumeOfCarrier;
            vector<string> items(numOfItems);
            volume.resize(numOfItems);
            importance.resize(numOfItems);
            int count = 0;
            while (numOfItems--){
                cin >> items[count] >> volume[count] >> importance[count];
                count++;
            }
            memset(cache, -1, sizeof(cache));
            //itemsIndex.clear();
            cout << solve(0, volumeOfCarrier);
            vector<int> itemsIndex;
            int volumeLimit = volumeOfCarrier;
    
            if (items.size() == 1 && volume[0] <= volumeOfCarrier) cout << ' ' << 1 << endl << items[0] << endl;
            else if (*min_element(volume.begin(), volume.end()) > volumeOfCarrier) cout << ' ' << 0 << endl;
            else{
                for (int i = 0; i < items.size() - 1; ++i){
                    if (cache[i][volumeLimit] >cache[i + 1][volumeLimit]){
                        itemsIndex.push_back(i); volumeLimit -= volume[i];
                    }
                }
                if (cache[items.size() - 1][volumeLimit] == importance[items.size() - 1]) itemsIndex.push_back(items.size() - 1);
                cout << ' ' << itemsIndex.size() << endl;
                for (int i = 0; i < itemsIndex.size(); ++i)
                    cout << items[itemsIndex[i]] << endl;
            }
    
    
        }
    
    }
    

    9년 전
2개의 댓글이 있습니다.
  • Toivoa
    Toivoa
    1. W <= 1000이기 때문에 cache[100][1001]로 잡으셔야 합니다.
    2. short을 사용하셨는데, short은 -32768~32767 입니다. 물건 수가 100개, 절박도가 최대 1000이기 때문에 100*1000 = 10만이 되어 short의 범위를 넘어갑니다.

    9년 전 link
  • kiyeon88
    kiyeon88

    감사합니다.
    1. 1001로 바꾸고, 2. int로 잡아줘도 오답이 나와요


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