ACM UVA 10036 (Problem C: Divisibility)

913阅读 0评论2009-06-06 chnos
分类:

题目:

思路:
整除+DP

将输入存放在数组input[10000]中。
remains[100]用来保存当前的状态(计算到input[i]时,当前所有可能的余数)。利用remains计算出 加或者减input[i+1]后,所有的余数。并将这些余数再次存放在remains中。到计算完input[N-1]后,如果remains保存的余数中存在0,那么就能整除。

代码:

#include <iostream>
#include <cstring>

using namespace std;

inline int ABS(int v)
{
    if (v < 0) {
        v = 0 - v;
    }
    return v;
}

int main()
{
    int caseCount = 0;
    int remains[100];
    int remainsTmp[100];
    int input[10000];

    cin >> caseCount;
    for (; caseCount != 0; caseCount--) {
        int N, K;
        cin >> N >> K;
        for (int i = 0; i < N; i ++) {
            cin >> input[i];
        }

        memset(remains, 0, 100*sizeof(int));
        int x = input[0] % K;
        if (x < 0) {
            x = K + x;
        }
        remains[x] = 1;
        
        for (int i = 1; i < N; i++) {
            memset(remainsTmp, 0, sizeof(int)*100);
            for (int j = 0; j < 100; j++) {
                if (remains[j] == 1) {
                    int m1 = (j+input[i]) % K;
                    if (m1 < 0) {
                        m1 = K + m1;
                    }
                    int m2 = (j-input[i]) %K;
                    if (m2 < 0) {
                        m2 = K + m2;
                    }
                    //cout << m1 << " " << m2 << endl;
                    remainsTmp[m1] = 1;
                    remainsTmp[m2] = 1;
                }
            }
            //cout << endl;
            memcpy(remains, remainsTmp, sizeof(int)*100);
        }

        if (remains[0] == 1) {
            cout << "Divisible";
        } else {
            cout << "Not divisible";
        }
        if (caseCount != 0) {
            cout << endl;
        }
    }
}

上一篇:ACM UVA 10034 (Problem A: Freckles)
下一篇:ACM UVA 10037 (Problem D: Bridge)