COINS 문제 질문 드립니다. (디버깅)

  • gloryof11
    gloryof11

    COINS

    안녕하세요. 오랜만에 도전을 하고 있는데, COIN 문제의 오답 원인을 찾지 못하고 있습니다..
    아래 코드에서 어떤 부분이 문제가 될 수 있는지 고수님들의 조언 부탁드립니다... (거의 온것 같은데,, 어렵네요....)

    #include <stdio.h>
    
    int T;          // 1<=T<=100
    int M;          // 1<=M<=5000
    int C;          // 1<=C<=100 , the biggest coin is 5000
    int CDATA[100]; // max is 100
    int ANSWER;
    int memo[5000][100];
    int z;
    
    int find(int M, int maxidx)
    {
        int cnt = 0;
    
        // condition for end
        if(M == 0)
            return 1;
        else if (M < 0)                 
            return 0;
    
        // memoization
        if(memo[M][maxidx] != 0)
            return memo[M][maxidx];
    
        // recursive function
        for(int i=0;i<C;i++)
        {
            if(CDATA[i] <= CDATA[maxidx] && M-CDATA[i]>=0)
                cnt = cnt + find(M-CDATA[i],i);
        }
    
        // problem's limitation
        cnt = cnt % 1000000007;
    
        // memoization
        memo[M][maxidx] = cnt;
    
        return cnt;
    }
    
    int main(void)
    {
        int max =0;
        int maxidx = 0;
    
        scanf("%d", &T);
    
        for(int i=0;i<T;i++)
        {
            // init
            ANSWER = 0;
            z = 0;
            max = 0;
    
            // input
            scanf("%d %d", &M, &C);
    
            for(int j=0;j<C;j++)
            {
                int temp;
                int flag = 0;
    
                scanf("%d", &temp);
    
                for(int k=0;k<j;k++)
                {
                    if(CDATA[k] == temp) flag = 1;
                }
    
                if(flag == 0) {
                    CDATA[z] = temp;
                    z++;
                }
            }
    
            // input correction
            C = z;
    
            if(M == 0) {
                printf("%d\n",M);
    
                for(int j=0;j<5000;j++)
                    for(int k=0;k<C;k++)
                        memo[j][k] = 0;
    
                continue;
            }
    
            // find biggest coin
            for(int j=0;j<C;j++)
            {
                if(max<CDATA[j]) {
                    max = CDATA[j]; maxidx = j;
                }
            }
    
            printf("%d\n",find(M,maxidx));
    
            // init
            for(int j=0;j<5000;j++)
                for(int k=0;k<C;k++)
                    memo[j][k] = 0;
        }
    
        return 0;
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Namnamseo
    Namnamseo
    // recursive function
        for(int i=0;i<C;i++)
        {
            if(CDATA[i] <= CDATA[maxidx] && M-CDATA[i]>=0)
                cnt = cnt + find(M-CDATA[i],i);
        }
    

    이 부분에서 이미 오버플로가 나는 경우도 있지 않을까요?


    10년 전 link
  • gloryof11
    gloryof11

    날카롭고 적절한 조언에 감사드립니다.
    (저는 아직도 가야할 길이 많이 남은 것 같습니다;)


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