80分,第六个点WA,最后一个点T
#include<bits/stdc++.h>
#define N 1009
using namespace std;
typedef long long ll;
ll m,n,s[N],sum=0,a[N],b[N],l=0,r,ans=0,cnt=0;
bool vis[N];
bool dfs(ll x,ll sum,ll sum2,ll goal){
// cout<<x<<" "<<sum<<" "<<sum2<<" "<<goal<<"\n";
++cnt;
if(cnt==18000000){
cout<<ans,exit(0);
}
if(sum2==0) return 1;
if(x==m+1) return 0;
if(sum<sum2) return 0;//a:待切栅栏 b:应得栅栏
bool ok=1;//sum:待切 sum2:被切
for(ll i=1;i<=goal;++i)
if(!vis[i]&&a[x]>=b[i]){ok=0;break;}
if(ok){
if(dfs(x+1,sum-a[x],sum2,goal)) return 1;
return 0;
}
for(ll i=1;i<=goal;++i){
if(vis[i]||a[x]<b[i]) continue;
a[x]-=b[i],vis[i]=1;
// cout<<i<<"\n";
if(dfs(x,sum-b[i],sum2-b[i],goal)){
a[x]+=b[i],vis[i]=0;
return 1;
}
a[x]+=b[i],vis[i]=0;
}
return 0;
}
bool ok(ll mid){return dfs(1,sum,s[mid],mid);}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>m;
for(ll i=1;i<=m;++i) cin>>a[i],sum+=a[i];
cin>>n;
for(ll i=1;i<=n;++i) cin>>b[i];
r=n;
sort(a+1,a+m+1);
sort(b+1,b+n+1);
for(ll i=1;i<=n;++i) s[i]=s[i-1]+b[i];
while(l<=r){
ll mid=(l+r)/2;
if(ok(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
cout<<ans;
return 0;
}