/* ID:chenjiong PROG:holstein LANG:C++ */ #include <stdio.h> #include <string.h> int V; int vitamin[30]; int G; int feed[20][30]; int idx[20]; int limit[20]; int R; bool flag = false; bool is_ok() { int i,j; for ( i = 0; i < V; i++) { int sum = 0; for ( j = 0; j < R; j++) sum += feed[idx[j]][i]; if ( sum < vitamin[i] ) return false; } return true; } void print() { int p; flag = true; printf("%d ",R); for ( p = 0; p < R - 1; p++) printf("%d ",idx[p] + 1); printf("%d\n",idx[R - 1] + 1); } void comb() { //pick R among G feeds int i,j,k,p; for ( i = 0; i < R; i++) { idx[i] = i; limit[i] = i + G - R; } if ( is_ok() ) { //check the first combination print(); return; } for ( j = R - 1; j >= 0; j--) { if ( j == 0 && idx[j] == limit[j] ) { //check the last combination if ( is_ok() ) { print(); break; } } if ( idx[j] < limit[j] ) { idx[j]++; for ( k = j + 1; k < R; k++) idx[k] = idx[k - 1] + 1; if ( is_ok() ) { print(); break; } j = R; } } } int main() { freopen("holstein.in","r",stdin); freopen("holstein.out","w",stdout); int i,j; scanf("%d",&V); for ( i = 0; i < V; i++) scanf("%d",&vitamin[i]); scanf("%d",&G); for ( i = 0; i < G; i++) for ( j = 0; j < V; j++) scanf("%d",&feed[i][j]); for ( i = 1; i <= G; i++) { R = i; comb(); if ( flag ) break; } return 0; }