这里求的是一串数字中选任意个数字,输出他们的和。
采用递归思想
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int cnt;
int a[100];
bool vis[100];
int sum[100000];
void solve(int x,int y,int pre){//x是要选几个数字,y是从哪里开始选,pre是之前已经选了多少
for(int i=y;i<n;i++){
if(i+x-1>n){
break;
}
if(vis[i]==false)
sum[cnt]+=a[i];
else{
continue;
}
vis[i]=true;
if(x>1)
{
solve(x-1,i+1,sum[cnt]);
}
vis[i]=false;
cnt++;
sum[cnt]+=pre;
}
}
int main(){
cnt=1;
cin>>n;
int all=0;
for(int i=0;i<100000;i++){
sum[i]=0;
}
for(int i=0;i<n;i++)
{
cin>>a[i];vis[i]=false;all+=a[i];
}
for(int i=1;i<=n/2;i++){
solve(i,0,0);
}
for(int i=0;i<cnt;i++){
sum[i+cnt]=all-sum[i];
}
sort(sum,sum+cnt*2);
int sum_2[100000];
sum_2[0]=sum[0];
int crt=1;
for(int i=1;i<2*cnt;i++){
if(sum[i]!=sum[i-1]){
sum_2[crt++]=sum[i];
}
}
for(int i=0;i<crt;i++){
cout<<sum_2[i]<<endl;
}
return 0;
}
结果:
input:
6
1
10
100
1000
10000
100000
output:
0
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111
100000
100001
100010
100011
100100
100101
100110
100111
101000
101001
101010
101011
101100
101101
101110
101111
110000
110001
110010
110011
110100
110101
110110
110111
111000
111001
111010
111011
111100
111101
111110
111111