[SUSHI] 문제 동적계획법으로 풀었는데 답이 다르게 나옵니다.

  • icbm
    icbm

    제 알고리즘이 잘못 되었나요? 제가 사용한 알고리즘이 맞는것 같은데
    (배낭문제 알고리즘과 같은 알고리즘으로 풀었습니다.)
    테스트 케이스의 첫번째 답이 28이 나오지 않고 26이 나오네요
    잘못된 부분있으면 알려주세요~
    일단 배열의 크기는 첫번째 테스트케이스에는 상관없도록 하였습니다.

    #include<stdio.h>
    #pragma warning(disable:4996)
    int C, N, M, arr[201][21];
    int prefer[21];
    int price[21];
    int main(){
        int i, j;
        scanf("%d %d", &N, &M);
        for (i = 1; i <= N; i++){
            scanf("%d %d", &price[i], &prefer[i]);
        }
        for (i = 1; i <= M/100; i++){//잔액
            for (j = 1; j <= N; j++){//먹는 음식의 수
                if (i >= price[j] / 100){
                    if (arr[i - price[j] / 100][j - 1] + prefer[j] >= arr[i][j - 1])
                        arr[i][j] = arr[i - price[j] / 100][j - 1] + prefer[j];
                    else
                        arr[i][j] = arr[i][j - 1];
                }
                else
                    arr[i][j] = arr[i][j - 1];
            }
        }
        printf("%d\n", arr[M / 100][N]);
        return 0;
    }
    

    9년 전
2개의 댓글이 있습니다.
  • restart
    restart

    위와같은 설계의 경우 같은 음식을 여러번 선택하지 않습니다. 그래서 예제1번의 경우 2500, 3000, 4000을 택해 26이 나옵니다. 하지만 답은 3000 두개, 4000을 선택하여 만족도 28을 얻는 경우입니다.


    9년 전 link
  • icbm
    icbm

    감사합니다! 같은 음식을 고르는경우는 생각도 하지않고 있었네요...


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