#include<iostream> #include<vector> #include<algorithm> #define VECUINT std::vector<unsigned int> #define PUII std::pair<unsigned int, unsigned int> #define VECPUII std::vector<PUII > const unsigned int INF=1000000009; unsigned int getMin(const VECUINT & produkty, const VECUINT & plecaki){ VECUINT P(produkty.size()); P[0]=1; for(unsigned int i=1;i<P.size();++i) P[i]=(P[i-1]<<1); unsigned int m=(P[P.size()-1]<<1); VECPUII rozwiazanie(m,PUII(INF,INF)); rozwiazanie[0]=PUII(1,0); for(unsigned int i=1;i<m;++i){ for(unsigned int l=i,j=0;l>0;l>>=1,++j) if(l%2==1) { PUII c=rozwiazanie[i-P[j]]; if((produkty[j]+c.second)<=plecaki[c.first-1]){ PUII q=PUII(c.first,c.second+produkty[j]); if(q.first==rozwiazanie[i].first&&q.second<rozwiazanie[i].second) rozwiazanie[i]=q; else if(q.first<rozwiazanie[i].first) rozwiazanie[i]=q; } else if(c.first<plecaki.size()&&produkty[j]<=plecaki[c.first]){ PUII q=PUII(c.first+1,produkty[j]); if(q.first==rozwiazanie[i].first&&q.second<rozwiazanie[i].second) rozwiazanie[i]=q; else if(q.first<rozwiazanie[i].first) rozwiazanie[i]=q; } } if(rozwiazanie[i].first>=INF) return INF; } return rozwiazanie[m-1].first; } int main(){ std::ios_base::sync_with_stdio(false); unsigned int n,m; std::cin>>n>>m; VECUINT produkty(n),plecaki(m); for(unsigned int i=0;i<n;++i) std::cin>>produkty[i]; for(unsigned int i=0;i<m;++i) std::cin>>plecaki[i]; std::sort(plecaki.begin(),plecaki.end(),std::greater<unsigned int>()); unsigned int R=getMin(produkty,plecaki); if(R<INF) std::cout<<R<<"\n"; else std::cout<<"NIE"<<"\n"; return 0; }
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 | #include<iostream> #include<vector> #include<algorithm> #define VECUINT std::vector<unsigned int> #define PUII std::pair<unsigned int, unsigned int> #define VECPUII std::vector<PUII > const unsigned int INF=1000000009; unsigned int getMin(const VECUINT & produkty, const VECUINT & plecaki){ VECUINT P(produkty.size()); P[0]=1; for(unsigned int i=1;i<P.size();++i) P[i]=(P[i-1]<<1); unsigned int m=(P[P.size()-1]<<1); VECPUII rozwiazanie(m,PUII(INF,INF)); rozwiazanie[0]=PUII(1,0); for(unsigned int i=1;i<m;++i){ for(unsigned int l=i,j=0;l>0;l>>=1,++j) if(l%2==1) { PUII c=rozwiazanie[i-P[j]]; if((produkty[j]+c.second)<=plecaki[c.first-1]){ PUII q=PUII(c.first,c.second+produkty[j]); if(q.first==rozwiazanie[i].first&&q.second<rozwiazanie[i].second) rozwiazanie[i]=q; else if(q.first<rozwiazanie[i].first) rozwiazanie[i]=q; } else if(c.first<plecaki.size()&&produkty[j]<=plecaki[c.first]){ PUII q=PUII(c.first+1,produkty[j]); if(q.first==rozwiazanie[i].first&&q.second<rozwiazanie[i].second) rozwiazanie[i]=q; else if(q.first<rozwiazanie[i].first) rozwiazanie[i]=q; } } if(rozwiazanie[i].first>=INF) return INF; } return rozwiazanie[m-1].first; } int main(){ std::ios_base::sync_with_stdio(false); unsigned int n,m; std::cin>>n>>m; VECUINT produkty(n),plecaki(m); for(unsigned int i=0;i<n;++i) std::cin>>produkty[i]; for(unsigned int i=0;i<m;++i) std::cin>>plecaki[i]; std::sort(plecaki.begin(),plecaki.end(),std::greater<unsigned int>()); unsigned int R=getMin(produkty,plecaki); if(R<INF) std::cout<<R<<"\n"; else std::cout<<"NIE"<<"\n"; return 0; } |