bit全探索(ABC 104 C問題)
問題
以下ネタバレ注意
以下ネタバレ注意
- ll p[10], c[10];
- int main() {
- int D, G;
- cin >> D >> G;
- REP(i, D) {
- cin >> p[i] >> c[i];
- }
- ll ans = INF;
- bool used[10];
- REP(i, 10)used[i] = false;
- //各配点の問題を解ききるかどうかで全探索(2^10通り)
- for (int x = 0; x < myPow(2, D, m); x++) {
- //例えばD = 10なら000000000000~1111111111を調べるので10進数だと0~1023
- int sum = 0;
- ll cnt = 0;
- for (int i = 0; i < D; i++) {
- if (x&(1 << i)) {//右からi桁目が1ならば
- used[i] = true;
- sum += 100 * (i + 1)*p[i] + c[i];
- cnt += p[i];
- }
- }
- if (sum >= G) {
- ans = min(ans, cnt);
- }
- else {
- REPR(i, D-1) {
- if (!used[i]) {
- REP(j, p[i]+1) {
- sum += 100 * (i + 1);
- cnt++;
- if (sum >= G) {
- ans = min(ans, cnt);
- break;
- }
- }
- }
- }
- }
- REP(i, 10)used[i] = false;
- }
- cout << ans << endl;
- }