#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define rep(i,n) for(int i=0; i pi; typedef pair pl; typedef pair plc; typedef pair pss; int n; ll dp[(1 << 16)],cost[(1<<16)]; int m[20]; const ll inf = (ll)(1e10); bool contain(int mask, int pos) { if ((mask & (1 << pos)) != 0)return true; return false; } int bit_count(int n) { unsigned int a = (n & 0x55555555) + ((n >> 1) & 0x55555555); unsigned int b = (a & 0x33333333) + ((a >> 2) & 0x33333333); unsigned int c = (b & 0x0f0f0f0f) + ((b >> 4) & 0x0f0f0f0f); unsigned int d = (c & 0x00ff00ff) + ((c >> 8) & 0x00ff00ff); return (d & 0xffff) + (d >> 16); } int main() { cin >> n; rep(i, n)cin >> m[i]; rep(i, (1 << n))dp[i] = inf; rep(mask, (1 << n)) { rep(i, n) { if ((mask & (1 << i)) != 0) { cost[mask] += m[i]; } } } dp[0] = 0; for (int mask = 1; mask <(1 << n); mask++) { for (int i = 0; i < n; i++) { if (contain(mask, i)) { for (int j = 1; j <= n; j++) { if (bit_count(mask) >= j) { ll x = m[i]-(cost[(mask ^ (1 << i))] % 1000); if (x < 0)x = 0; dp[mask] = min(dp[mask], dp[(mask^(1<