AtCoder Regular Contest 075: C - Bugged

,

http://arc075.contest.atcoder.jp/tasks/arc075_a

何も考えず書いたがoverkillだったらしい。

solution

DP。作れる和を全部列挙しても間に合う。$O(N \sum s_i)$。想定-非正攻法だったみたい。

implementation

#include <cstdio>
#include <vector>
#include <array>
#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))
#define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i))
using namespace std;
int main() {
    int n; scanf("%d", &n);
    vector<int> a(n); repeat (i,n) scanf("%d", &a[i]);
    array<bool, 10001> dp = {};
    dp[0] = true;
    repeat (i, n) {
        repeat_reverse (j, 10001) {
            if (dp[j] and j + a[i] < 10001) {
                dp[j + a[i]] = true;
            }
        }
    }
    int result = 0;
    repeat (i, 10001) {
        if (dp[i] and i % 10 != 0) {
            result = i;
        }
    }
    printf("%d\n", result);
    return 0;
}