#include<iostream>
#include<algorithm>
using namespace std;
int pot[30];
int a[24],b[100],c[24];
bool ok(int M,int nr){
int suma=0;
for(int i=0;i<24;i++)if(M&pot[i])suma+=a[i];
return suma<=c[nr];
}
bool caly[16777216];
int dasie[16777216],caly2[16777216];
main(){
pot[0]=1;
for(int i=1;i<30;i++)pot[i]=pot[i-1]*2;
int n,m;
cin>>n>>m;
int duzo=pot[n];
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<m;i++)cin>>b[i];
sort(a,a+n);
sort(b,b+m);
for(int i=0;i<n;i++)c[i]=b[m-n+i];
if(a[n-1]>c[n-1]){cout<<"NIE\n";return 0;}
for(int i=0;i<duzo;i++)caly[i]=ok(i,n-1);
//for(int i=0;i<duzo;i++)cout<<i<<" "<<caly[i]<<"\n";
//for(int i=0;i<n;i++)cout<<c[i]<<" ";
//cout<<"\n";
if(caly[duzo-1]){cout<<1<<"\n";return 0;}
int dasiesize,caly2size;
for(int i=n-2;i>=0;i--){
dasiesize=0;
caly2size=0;
for(int j=0;j<duzo;j++)if(ok(j,i)){dasie[dasiesize]=j;dasiesize++;}
for(int j=0;j<dasiesize;j++)if(caly[(duzo-1)^dasie[j]]){cout<<n-i<<"\n";return 0;}
for(int j=0;j<duzo;j++)if(caly[j]){caly2[caly2size]=j;caly2size++;}
//cout<<dasiesize<<" "<<caly2size<<"\n";
for(int j=0;j<dasiesize;j++){
for(int k=0;k<caly2size;k++)caly[dasie[j]|caly2[k]]=1;
}
}
cout<<"NIE\n";
}
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 | #include<iostream> #include<algorithm> using namespace std; int pot[30]; int a[24],b[100],c[24]; bool ok(int M,int nr){ int suma=0; for(int i=0;i<24;i++)if(M&pot[i])suma+=a[i]; return suma<=c[nr]; } bool caly[16777216]; int dasie[16777216],caly2[16777216]; main(){ pot[0]=1; for(int i=1;i<30;i++)pot[i]=pot[i-1]*2; int n,m; cin>>n>>m; int duzo=pot[n]; for(int i=0;i<n;i++)cin>>a[i]; for(int i=0;i<m;i++)cin>>b[i]; sort(a,a+n); sort(b,b+m); for(int i=0;i<n;i++)c[i]=b[m-n+i]; if(a[n-1]>c[n-1]){cout<<"NIE\n";return 0;} for(int i=0;i<duzo;i++)caly[i]=ok(i,n-1); //for(int i=0;i<duzo;i++)cout<<i<<" "<<caly[i]<<"\n"; //for(int i=0;i<n;i++)cout<<c[i]<<" "; //cout<<"\n"; if(caly[duzo-1]){cout<<1<<"\n";return 0;} int dasiesize,caly2size; for(int i=n-2;i>=0;i--){ dasiesize=0; caly2size=0; for(int j=0;j<duzo;j++)if(ok(j,i)){dasie[dasiesize]=j;dasiesize++;} for(int j=0;j<dasiesize;j++)if(caly[(duzo-1)^dasie[j]]){cout<<n-i<<"\n";return 0;} for(int j=0;j<duzo;j++)if(caly[j]){caly2[caly2size]=j;caly2size++;} //cout<<dasiesize<<" "<<caly2size<<"\n"; for(int j=0;j<dasiesize;j++){ for(int k=0;k<caly2size;k++)caly[dasie[j]|caly2[k]]=1; } } cout<<"NIE\n"; } |
English