// Latihan bergaya OSN, Bab 11, soal 2 -- pembahasan. // // N <= 20, jadi seluruh 2^N himpunan bagian bisa dicoba. Setiap himpunan // bagian diwakili satu bilangan: bit ke-i menyala berarti elemen ke-i // ikut dipilih. #include #include using namespace std; int main() { int n; long long s; cin >> n >> s; vector a(n); for (int i = 0; i < n; i++) cin >> a[i]; long long terbaik = 0; // himpunan bagian kosong long long selisihTerbaik = s; // |0 - s| for (int mask = 1; mask < (1 << n); mask++) { long long jumlah = 0; for (int i = 0; i < n; i++) { if (mask & (1 << i)) jumlah += a[i]; } long long selisih = jumlah - s; if (selisih < 0) selisih = -selisih; if (selisih < selisihTerbaik || (selisih == selisihTerbaik && jumlah < terbaik)) { selisihTerbaik = selisih; terbaik = jumlah; } } cout << terbaik << "\n"; return 0; }