列举所有的子集找最优就行。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF;
int v[SZ],arr[SZ][SZ]; inline int lowbit(int x)
{
return x&-x;
} int getdgt(int x)
{
int res=;
for(;x;x-=lowbit(x),++res);
return res;
} bool chk(int x,int n)
{
int tmp[SZ];
memset(tmp,,sizeof(tmp));
for(int i=;i<;++i)
{
if(x&(<<i))
{
for(int j=;j<n;++j)
{
tmp[j]+=arr[i][j];
}
}
}
for(int j=;j<n;++j)
{
if(tmp[j]<v[j])return ;
}
return ;
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//for(lon time=1;time<=casenum;++time)
{
int n;
cin>>n;
for(int i=;i<n;++i)cin>>v[i];
int m;
cin>>m;
for(int i=;i<m;++i)
{
for(int j=;j<n;++j)
{
cin>>arr[i][j];
}
}
int mind=INF,res=;
for(int i=;i<(<<m);++i)
{
if(getdgt(i)<mind&&chk(i,n))
{
mind=getdgt(i);
res=i;
}
}
cout<<mind;
for(int i=;i<;++i)
{
if(res&(<<i))cout<<" "<<i+;
}
cout<<endl;
}
return ;
}