#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); } |