提交时间:2024-01-23 10:01:45

运行 ID: 123862

#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() { readda_(); return 0; }