/* paiza POH! Lite
* result:
* http://p...content-available-to-author-only...a.jp/poh/kirishima/result/35a1b041e3f3b0845bf20927f609d644
* author: Leonardone @ NEETSDKASU
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct _data {
int q;
int r;
double p;
int f;
} DATA, *PDATA;
int sort_p(void *a, void *b) {
PDATA pa = (PDATA)a;
PDATA pb = (PDATA)b;
double d = pa->p - pb->p;
if (d > 0) {
return 1;
} else if (d < 0) {
return -1;
} else {
return 0;
}
}
int sort_q(void *a, void *b) {
PDATA pa = (PDATA)a;
PDATA pb = (PDATA)b;
return pb->q - pa->q;
}
DATA data[50];
void foo(int m, int n) {
int a0, a1, b0, b1, c0;
int min, sum_q, sum_r;
int i;
if (n > 25) {
b0 = 0;
b1 = 1 << (n - 25);
} else {
b0 = 1 << n;
b1 = 0;
}
a0 = 1;
a1 = 0;
c0 = 1 << 25;
min = 250000000;
for (;;) {
if (a1 > b1) {
break;
} else if (a1 == b1 && a0 > b0) {
break;
}
if (a0 == c0) {
a0 = 0;
a1++;
}
sum_q = sum_r = 0;
for (i = 0; i < 25; i++) {
if ((a0 >> i) & 1) {
sum_q += data[i].q;
sum_r += data[i].r;
}
if ((a1 >> i) & 1) {
sum_q += data[i + 25].q;
sum_r += data[i + 25].r;
}
}
if (sum_q >= m && sum_r < min) {
min = sum_r;
}
a0++;
}
}
int main(void) {
int m, n;
PDATA pdata = data;
int i, j, k;
int sum_q, sum_r;
for (i = 0; i < n; i++) {
scanf("%d %d", &pdata
->q
, &pdata
->r
); pdata->p = (double)pdata->r / (double)pdata->q;
pdata++;
}
qsort(data
, n
, sizeof(DATA
), sort_p
);
sum_q = sum_r = 0;
pdata = data;
for (i = 0; i < n; i++) {
sum_q += pdata->q;
sum_r += pdata->r;
pdata->f = 1;
if (sum_q >= m) {
break;
}
pdata++;
}
i += 3;
foo(m, i > n ? n : i);
return 0;
}
LyogcGFpemEgUE9IISBMaXRlCiAqIHJlc3VsdDoKICogaHR0cDovL3AuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEuanAvcG9oL2tpcmlzaGltYS9yZXN1bHQvMzVhMWIwNDFlM2YzYjA4NDViZjIwOTI3ZjYwOWQ2NDQKICogYXV0aG9yOiBMZW9uYXJkb25lIEAgTkVFVFNES0FTVQogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IF9kYXRhIHsKCWludCBxOwoJaW50IHI7Cglkb3VibGUgcDsKCWludCBmOwp9IERBVEEsICpQREFUQTsKCmludCBzb3J0X3Aodm9pZCAqYSwgdm9pZCAqYikgewoJUERBVEEgcGEgPSAoUERBVEEpYTsKCVBEQVRBIHBiID0gKFBEQVRBKWI7Cglkb3VibGUgZCA9IHBhLT5wIC0gcGItPnA7CglpZiAoZCA+IDApIHsKCQlyZXR1cm4gMTsKCX0gZWxzZSBpZiAoZCA8IDApIHsKCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXJldHVybiAwOwoJfQp9CgppbnQgc29ydF9xKHZvaWQgKmEsIHZvaWQgKmIpIHsKCVBEQVRBIHBhID0gKFBEQVRBKWE7CglQREFUQSBwYiA9IChQREFUQSliOwoJcmV0dXJuIHBiLT5xIC0gcGEtPnE7Cn0KCgpEQVRBIGRhdGFbNTBdOwoKdm9pZCBmb28oaW50IG0sIGludCBuKSB7CglpbnQgYTAsIGExLCBiMCwgYjEsIGMwOwoJaW50IG1pbiwgc3VtX3EsIHN1bV9yOwoJaW50IGk7CgogCWlmIChuID4gMjUpIHsKCQliMCA9IDA7CgkJYjEgPSAxIDw8IChuIC0gMjUpOwoJfSBlbHNlIHsKCQliMCA9IDEgPDwgbjsKCQliMSA9IDA7Cgl9CiAKCWEwID0gMTsKCWExID0gMDsKCWMwID0gMSA8PCAyNTsKCW1pbiA9IDI1MDAwMDAwMDsKCWZvciAoOzspIHsKCQlpZiAoYTEgPiBiMSkgewoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGExID09IGIxICYmIGEwID4gYjApIHsKCQkJYnJlYWs7CgkJfQoJCWlmIChhMCA9PSBjMCkgewoJCQlhMCA9IDA7CgkJCWExKys7CgkJfQoJCXN1bV9xID0gc3VtX3IgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CgkJCWlmICgoYTAgPj4gaSkgJiAxKSB7CgkJCQlzdW1fcSArPSBkYXRhW2ldLnE7CgkJCQlzdW1fciArPSBkYXRhW2ldLnI7CgkJCQl9CgkJCWlmICgoYTEgPj4gaSkgJiAxKSB7CgkJCQlzdW1fcSArPSBkYXRhW2kgKyAyNV0ucTsKCQkJCXN1bV9yICs9IGRhdGFbaSArIDI1XS5yOwoJCQl9CgkJfQoJCWlmIChzdW1fcSA+PSBtICYmIHN1bV9yIDwgbWluKSB7CgkJCW1pbiA9IHN1bV9yOwoJCX0KCQlhMCsrOwoJfQoJcHJpbnRmKCIlZFxuIiwgbWluKTsKCn0KCgppbnQgbWFpbih2b2lkKSB7CgkKCWludCBtLCBuOwoJUERBVEEgcGRhdGEgPSBkYXRhOwoJaW50IGksIGosIGs7CglpbnQgc3VtX3EsIHN1bV9yOwoJCglzY2FuZigiJWQiLCAmbSk7CglzY2FuZigiJWQiLCAmbik7CgkKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlzY2FuZigiJWQgJWQiLCAmcGRhdGEtPnEsICZwZGF0YS0+cik7CgkJcGRhdGEtPnAgPSAoZG91YmxlKXBkYXRhLT5yIC8gKGRvdWJsZSlwZGF0YS0+cTsKCQlwZGF0YSsrOwoJfQoJCglxc29ydChkYXRhLCBuLCBzaXplb2YoREFUQSksIHNvcnRfcCk7CgkKCXN1bV9xID0gc3VtX3IgPSAwOwoJcGRhdGEgPSBkYXRhOwoJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewoJCXN1bV9xICs9IHBkYXRhLT5xOwoJCXN1bV9yICs9IHBkYXRhLT5yOwoJCXBkYXRhLT5mID0gMTsKCQlpZiAoc3VtX3EgPj0gbSkgewoJCQlicmVhazsKCQl9CgkJcGRhdGErKzsKCX0KCQoJaSArPSAzOwoJCglmb28obSwgaSA+IG4gPyBuIDogaSk7CgkKCXJldHVybiAwOwp9Cg==