/* * thief's dilemna solution * */ #include #include #include struct { int val, space; } items [20]; int max, cur_max; int in [20]; int cur_in [20]; int num; int avail; void go (void); void copy (void); void print (void); int main (void) { char s [100]; int i; num = 0; gets (s); while (strcmp (s, "$END")) { sscanf (s, "%d %d", &items[num].val, &items [num].space); num++; gets (s); } while (gets (s) != NULL) { for (i = 0; i < 20; i++) cur_in [i] = in [i] = 0; max = 0; cur_max = 0; avail = atoi (s); go (); print (); } return 0; } void go (void) { int i; for (i = 0; i < num; i++) { if (cur_in [i]) continue; if (avail >= items [i].space) { cur_in [i] = 1; cur_max += items [i].val; avail = avail - items [i].space; if (max < cur_max) copy (); go (); cur_in [i] = 0; cur_max -= items [i].val; avail += items [i].space; } } } void copy (void) { int i; max = cur_max; for (i = 0; i < 20; i++) in [i] = cur_in [i]; } void print (void) { int i, flag; printf ("%d ", max); flag = 0; for (i = 0; i < num; i++) { if (in [i]) { if (flag) printf (","); flag = 1; printf ("%c", 'A' + i); } } printf ("\n"); }