Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 30
#define maxm 20
#define re register
int n,m,a[maxn],f[maxm][maxn],ans[maxm],AKIOI,ac[maxn],pdc[maxm];
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
inline bool check_(int x) {
memset(ac,0,sizeof(ac));
for(re int i=1;i<=x;++i) {
for(re int j=1;j<=n;++j) ac[j]+=f[ans[i]][j];
}
for(re int i=1;i<=n;++i) {
if(ac[i]<a[i]) return false;
}
return true;
}
void dfs_(int k,int x) {
if(check_(x)) {
if(x<AKIOI) {
AKIOI=x;
memcpy(pdc,ans,sizeof(pdc));
return;
}
else if(x==AKIOI) {
for(re int i=1;i<=x;++i) {
if(pdc[i]<ans[i]) return;
}
memcpy(pdc,ans,sizeof(pdc));
return;
}
}
if(k>m) return;
ans[x+1]=k;
dfs_(k+1,x+1);
ans[x+1]=0;
dfs_(k+1,x);
}
void readda_() {
n=read_();
for(re int i=1;i<=n;++i) a[i]=read_();
m=read_();
for(re int i=1;i<=m;++i) {
for(re int j=1;j<=n;++j) {
f[i][j]=read_();
}
}
memset(pdc,0x3f,sizeof(pdc));
AKIOI=1000000007;
dfs_(1,0);
printf("%d ",AKIOI);
for(re int i=1;i<=AKIOI;++i) {
printf("%d ",pdc[i]);
}
}
int main() {
freopen("a.txt","r",stdin);
readda_();
return 0;
}