AC代码:pos从大到小。
#include<bits/stdc++.h>
using namespace std;
const int N=51,M=1e3+5;
int m,n,a[N],b[M],c[N],sum[M],s=0,w=0;
bool dfs(int pos,int st,int mid){
if(!pos)return 1;
if(s-w<sum[mid])return 0;
for(int i=st;i<=m;i++){
if(a[i]>=b[pos]){
a[i]-=b[pos];
if(a[i]<b[1])w+=a[i];
if(b[pos]!=b[pos-1]){
if(dfs(pos-1,1,mid))return 1;
}
else{
if(dfs(pos-1,i,mid))return 1;
}
if(a[i]<b[1])w-=a[i];
a[i]+=b[pos];
}
}
return 0;
}
int main(){
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&c[i]);
s=s+c[i];
}
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+b[i];
}
int l=0,r=n;
while(s<sum[r])r--;
while(l<=r){
w=0;
for(int i=1;i<=m;i++){
a[i]=c[i];
}
int mid=(l+r)>>1;
if(dfs(mid,1,mid))l=mid+1;
else r=mid-1;
}
printf("%d",l-1);
return 0;
}
80分代码:pos从小到大。
#include<bits/stdc++.h>
using namespace std;
const int N=51,M=1e3+5;
int m,n,a[N],b[M],c[N],sum[M],s=0,w=0;
bool dfs(int pos,int st,int mid){
if(pos==mid+1)return 1;
if(s-w<sum[mid])return 0;
for(int i=st;i<=m;i++){
if(a[i]>=b[pos]){
a[i]-=b[pos];
if(a[i]<b[1])w+=a[i];
if(b[pos]!=b[pos-1]){
if(dfs(pos+1,1,mid))return 1;
}
else{
if(dfs(pos+1,i,mid))return 1;
}
if(a[i]<b[1])w-=a[i];
a[i]+=b[pos];
}
}
return 0;
}
int main(){
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&c[i]);
s=s+c[i];
}
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+b[i];
}
int l=0,r=n;
while(s<sum[r])r--;
while(l<=r){
w=0;
for(int i=1;i<=m;i++){
a[i]=c[i];
}
int mid=(l+r)>>1;
if(dfs(1,1,mid))l=mid+1;
else r=mid-1;
}
printf("%d",l-1);
return 0;
}