原题:https://www.luogu.org/problemnew/show/P1460
//USACO2.1 健康的荷斯坦奶牛
//by dadatu
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int kind[1010][1010],a[1010],cur[1010],ans[1010],v[1010],visit[1010];
int n,m,minn=0x3f3f3f3f,cnt=0;
bool judge()
{
bool f=true;
if (cnt>=minn) return !f;
for (int i=0;i<n;i++)
if (cur[i]<v[i]) f=false;
return f;
}
void dfs()
{
if (cnt>=minn) return;//剪枝,如果已经超过当前最优解就不需要再继续搜了
if (judge())//替换
{
minn=cnt;
for (int i=0;i<cnt;i++) ans[i]=a[i];
}
for (int i=0;i<m;i++)
{
if (!visit[i]&&i>=a[cnt-1])//剪枝,从小到大排
{
visit[i]++;a[cnt++]=i;
for (int j=0;j<n;j++) cur[j]+=kind[i][j];
dfs();
for (int j=0;j<n;j++) cur[j]-=kind[i][j];
cnt--;visit[i]=0;//回溯
}
}
}
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%d",&v[i]);
scanf("%d",&m);
for (int i=0;i<m;i++)
for (int j=0;j<n;j++) scanf("%d",&kind[i][j]);
dfs();
printf("%d",minn);
for (int i=0;i<minn;i++) printf(" %d",ans[i]+1);
printf("\n");
return 0;
}