백준 4781번 사탕가게 UKP 문제 질문입니다.

  • gkfkagkfka12
    gkfkagkfka12

    질문을 백준이랑 알고스팟, 구글링해가면서 계속 찾았고 뭐가 잘못되었는지 알아보았는데 도저히 모르겠어서 이렇게 남깁니다.

    사탕가게

    어쨌든 설명하자면 UKP 문제인데 단순히 기본적인 알고리즘으로 1차원 배열 사용해서 DP로 짰는데 이것도 위키백과의 수도코드를 그대로 구현한 겁니다.

    계속 틀렸습니다가 뜨면서 실수에서 정수변환 문제인가 해서 0.5도 추가해서 100 곱했는데도 계속 틀렸습니다가 뜨네요...
    뭐가 문제일까요?

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    int dp[10005]; // 1원~10,000원까지 가질 수 있음
    int candy[5005][2]; // 사탕의 개수는 최대 5000개 그리고 사탕의 칼로리와 가격
    
    int main(void)
    {
        // int_m, int_p는 소수를 정수로 바꾸기 위한 변수
        int n, c, int_m, int_p;
        double m, p;
        scanf("%d %lf", &n, &m);
        int_m = (int)((m + 0.5) * 100);
    
        while (n&&int_m) {
            for (int i = 1; i <= n; i++) {
                scanf("%d %lf", &c, &p);
                int_p = (int)(p * 100 + 0.5);
                candy[i][0] = c; candy[i][1] = int_p;
            }
    
            for (int p = 1; p <= int_m; p++) {
                for (int i = 1; i <= n; i++) {
                    int ci = candy[i][0]; // 사탕의 칼로리
                    int pi = candy[i][1]; // 사탕의 가격
                    if (pi <= p)
                        dp[p] = std::max(dp[p], ci + dp[p - pi]);
                }
            }
    
            printf("%d\n", dp[int_m]);
            memset(dp, 0, sizeof(dp));
            scanf("%d %lf", &n, &m);
        }
    
        return 0;
    }
    

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