#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int naj[16777218];
bool czy[16777218];
int dobre[16777218];
int plecaki[101];
int przedmioty[25];
int main(){
int n,m;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++){
scanf("%d", &przedmioty[i]);
}
for(int i=1; i<=m; i++){
scanf("%d", &plecaki[i]);
}
sort(plecaki, plecaki+(m+1));
sort(przedmioty, przedmioty+(n+1));
for(int i=1; i<=m/2; i++)
swap(plecaki[i],plecaki[m-i+1]);
int p=1;
czy[0]=1;
for(int i=1; i<=n; i++)
p*=2;
p--;
for(int i=1; i<=p; i++)
naj[i]=1000000009;
int j=1;
int kon1=1, kon2=1,pocz=1;
while(p>0 && j<=n){
int r=1;
for(int i=1; i<=n; i++){
int x=kon2;
for(int l=pocz; l<=x; l++){
// printf("%d %d\n", l, dobre[l]);
int it=dobre[l];
if(naj[it]+przedmioty[i]<=plecaki[j] && naj[it]+przedmioty[i]<naj[(it) | r]){
naj[(it) | r]=naj[it]+przedmioty[i];
if(czy[(it) | r]==0){
p--;
czy[(it) | r]=1;
kon2++;
dobre[kon2]=it | r;
}
}
}
r*=2;
}
for(int i=kon1; i<=kon2; i++)
naj[dobre[i]]=0;
pocz=kon1+1;
kon1=kon2;
j++;
}
j--;
if(p>0)
printf("NIE");
else
printf("%d", j);
}
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 63 64 65 66 67 68 69 70 | #include<cstdio> #include<vector> #include<algorithm> using namespace std; int naj[16777218]; bool czy[16777218]; int dobre[16777218]; int plecaki[101]; int przedmioty[25]; int main(){ int n,m; scanf("%d%d", &n, &m); for(int i=1; i<=n; i++){ scanf("%d", &przedmioty[i]); } for(int i=1; i<=m; i++){ scanf("%d", &plecaki[i]); } sort(plecaki, plecaki+(m+1)); sort(przedmioty, przedmioty+(n+1)); for(int i=1; i<=m/2; i++) swap(plecaki[i],plecaki[m-i+1]); int p=1; czy[0]=1; for(int i=1; i<=n; i++) p*=2; p--; for(int i=1; i<=p; i++) naj[i]=1000000009; int j=1; int kon1=1, kon2=1,pocz=1; while(p>0 && j<=n){ int r=1; for(int i=1; i<=n; i++){ int x=kon2; for(int l=pocz; l<=x; l++){ // printf("%d %d\n", l, dobre[l]); int it=dobre[l]; if(naj[it]+przedmioty[i]<=plecaki[j] && naj[it]+przedmioty[i]<naj[(it) | r]){ naj[(it) | r]=naj[it]+przedmioty[i]; if(czy[(it) | r]==0){ p--; czy[(it) | r]=1; kon2++; dobre[kon2]=it | r; } } } r*=2; } for(int i=kon1; i<=kon2; i++) naj[dobre[i]]=0; pocz=kon1+1; kon1=kon2; j++; } j--; if(p>0) printf("NIE"); else printf("%d", j); } |
English