module main; // https://kmjp.hatenablog.jp/entry/2015/10/09/0900 より // ビットDP import std; // aとbを比較してbの方が小さいならばaの値をbに更新する void chMin(T)(ref T a, in T b) { if (a > b) a = b; } void main() { // 入力 int N = readln.chomp.to!int; auto M = new long[](N); foreach (ref m; M) m = readln.chomp.to!long; // 答えの計算 auto dp = uninitializedArray!(long[])(1 << N); dp[] = 10L ^^ 18; dp[0] = 0; foreach (mask; 0 .. (1 << N) - 1) { long total = 0; foreach (i; 0 .. N) if (mask & (1 << i)) total += M[i]; total %= 1000; foreach (i; 0 .. N) if ((mask & (1 << i)) == 0) chMin(dp[mask | (1 << i)], dp[mask] + max(0, M[i] - total)); } // 答えの出力 writeln(dp[(1 << N) - 1]); }