剪枝不如不剪枝......
#include<bits/stdc++.h>
using namespace std;
int a[60],b[1124];
int n,m,maxn=0,ans=0,all=0,sum[1124],waste=0,c[1124],mid;
bool dfs(int x,int ks){//当前在为第x个人选吃那个蛋糕
if(x==0)return true;
if(all-waste<sum[mid])return false;
for(int i=ks;i<=n;i++){
if(c[i]>=b[x]){
c[i]-=b[x];
if(c[i]<b[1])waste+=c[i];
if(b[x]==b[x-1]){
if(dfs(x-1,i)==true)return true;
}
else if(dfs(x-1,1)==true)return true;
if(c[i]<b[1])waste-=c[i];
c[i]=c[i]+b[x];
}
}
return false;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);//cake
all+=a[i];
maxn=max(maxn,a[i]);//max_cake
}
cin>>m;
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);//mouth[i]
sum[i]=sum[i-1]+b[i];
}
sort(b+1,b+m+1);
for(int i=1;i<=m;i++){
if(b[i]>maxn){
m=i-1;
break;
}
}
maxn=0;
int l=1,r=m;
while(l<=r){
mid=(l+r)/2;
waste=0;
for(int i=1;i<=n;i++){
c[i]=a[i];
}
if(dfs(mid,1)){
ans=mid;
l=mid+1;
}
else r=mid+1;
}
printf("%d",maxn);
return 0;
}