https://blog.csdn.net/waltonhuang/article/details/52149777 大神博客
方法1:
1 int n,x[22]; 2 3 int main() 4 { 5 cin>>n; 6 for(int i=1;i<=n;i++) cin>>x[i]; 7 int sum=0; 8 sort(x+1,x+1+n); 9 10 for(int i=1;i<=n;i++) 11 { 12 if( x[i] <= sum+1) 13 sum+=x[i]; 14 else break; 15 } 16 cout<<sum+1<<endl; 17 }
方法2: 递归
1 int n,x[22]; 2 vector<int>v; 3 set<int>s; //记录可以凑出的数 4 5 void solve(int sum,int i) 6 { 7 if(i==n+1){ 8 s.insert(sum); 9 return; 10 } 11 solve( sum+x[i],i+1); //对于一个数,选择加还是不加。 12 solve( sum, i+1); 13 } 14 15 int main() 16 { 17 cin>>n; 18 for(int i=1;i<=n;i++) cin>>x[i],v.push_back(x[i]); 19 sort(v.begin(),v.end()); 20 solve(0,1); 21 for(int i=0;i<=INF;i++) 22 { 23 if(s.find(i)==s.end()){ //遍历,找到第一个S中没出现的数; 24 cout<<i<<endl; 25 break; 26 } 27 } 28 }