1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include<bits/stdc++.h> using namespace std;
#define U(x) ((int)x.size()) #define pb push_back const int N=15e3+10,INF=1e9; #define gc getchar() #define rd read() inline int read(){ int x=0,f=0; char c=gc; for(;c<'0'||c>'9';c=gc) f|=(c=='-'); for(;c>='0'&&c<='9';c=gc) x=(x<<1)+(x<<3)+(c^48); return f?-x:x; }
int n,m,sum=0,ans=-1,a[N],b[N],s[N],cnt[N],c[N]; vector<bitset<N>> f[N]; vector<int> vc; bitset<N> pre[N]; struct cmp{ bool operator()(int x,int y){ return a[x]<a[y]; } }; priority_queue<int,vector<int>,cmp> q;
int main(){
n=rd; for(int i=1;i<=n;++i) sum+=(a[i]=rd),++s[1],--s[a[i]+1]; for(int i=1;i<=sum;++i) s[i]+=s[i-1]; for(int i=1;i<=sum;++i) s[i]+=s[i-1]; m=rd; for(int i=1;i<=m;++i) b[i]=rd; sort(b+1,b+m+1,[&](int x,int y){ return x>y; });
f[0].resize(1),f[0][0][0]=1; for(int i=0;i<=sum;++i) for(int j=0;j<=s[i];++j) pre[i][j]=1; for(int i=1,lim;i<=m;++i){ lim=sum/b[i],f[i].resize(lim+1),f[i][0]=f[i-1][0]; for(int j=0;j<=lim;++j){ if(j<U(f[i-1])) f[i][j]=f[i-1][j]; if(j>0) f[i][j]|=(f[i][j-1]<<b[i]); f[i][j]&=pre[j]; } } for(int i=0;ans==-1&&i<=sum/b[m];++i) if(f[m][i][sum]==1) ans=i;
if(ans==-1) return printf("-1\n"),0;
for(int i=m,j=ans,k=sum;j;){ for(;!f[i][j][k]||!f[i][j-1][k-b[i]];--i); c[j]=b[i],--j,k-=b[i]; }
printf("%d\n", ans); for(int i=1;i<=n;++i) q.push(i); for(int i=1;i<=ans;++i){ printf("%d ", c[i]); vc={}; for(int j=1;j<=c[i];++j){ int u=q.top(); q.pop(),vc.pb(u); printf("%d ", u); } for(int v:vc) if(--a[v]) q.push(v); puts(""); }
return 0; }
|