#include<iostream>#include<vector>#include<algorithm>usingnamespace std;//二分查找 遵循迭代器原则,end迭代器指向最后一个元素的下一个位置,beg迭代器指向需要查找范围的第一个元素boolmyBinary_search(const vector<int>::iterator beg,const vector<int>::iterator end,constint&val){int l=0,r= end - beg;while(r-l>=1){int i=(l+r)/2;if(*(beg+i)==val)returntrue;elseif(*(beg+i)<val) l=i+1;else r=i;}returnfalse;}intmain(){
vector<int> ivec;//保存牌点int m;//抽牌点数之和等于的点数for(int i =0; i !=ivec.size();++i){for(int j =0; j !=ivec.size();++j){for(int k =0; i !=ivec.size();++i){for(int l =0; l != ivec.size();++l){if(ivec.at(i)+ivec.at(j)+ivec.at(k)+ivec.at(l)==m){
cout<<"yes";return0;}}}}}
cout<<"no";return0;//以上程序是O(n^4)指数时间复杂度,我们使用一次二分搜索让其变成 O(n^3+2logn)//二分搜索会产生logn,排序会产生logn的时间复杂度sort(ivec.begin(),ivec.end());for(int i =0; i !=ivec.size();++i){for(int j =0; j !=ivec.size();++j){for(int k =0; i !=ivec.size();++i){if(binary_search(ivec.cbegin(),ivec.cend(),m-ivec.at(i)-ivec.at(j)-ivec.at(k))){
cout<<"yes";return0;}}}}//我们可以列举n*n个空间的数,使时间复杂度从O(n^3)变成O(n^2+logn+logn^2),空间复杂度为O(n^2),以此类推}