/*ID: yzmtf201PROG: holsteinLANG: C++*/#include <iostream>#include <cstdio>#include <algorithm>#include <queue>using namespace std;struct node{ int vit[25]; bool visited[25];} tmp,tmp1;deque<node> q;int v,g,goal[100],food[15][25],k;void add(int i,node a,node&b){ for(int j=0; j<v; j++) b.vit[j]=a.vit[j]+food[i][j];}bool check(node a){ for(int i=0; i<v; i++) if(goal[i]>a.vit[i])return false; return true;}void out(node a){ int i,list[100]; for(i=0; i<g; i++) if(a.visited[i])list[k++]=i+1; printf("%d ",k); for(i=0; i<k-1; i++) printf("%d ",list[i]); printf("%d\n",list[i]);}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",&goal[i]); scanf("%d",&g); for(i=0; i<g; i++) for(j=0; j<v; j++) scanf("%d",&food[i][j]); for(i=0; i<v; i++) tmp.vit[i]=0; q.push_back(tmp); while(!q.empty()) { tmp=q.front(); for(i=0; i<g; i++) { if(tmp.visited[i])continue; tmp1=tmp; tmp1.visited[i]=true; add(i,tmp,tmp1); //for(j=0;j<v;j++) //printf("%d ",tmp1.vit[i]); //printf("\n"); if(check(tmp1)) { out(tmp1); return 0;//== == == == END. } else q.push_back(tmp1); } q.pop_front(); } //== == == == actually,never reach here... return 0;}