排列组合———求一串数字可以有多少种不同的组合

本文深入探讨了一种使用递归思想求解一串数字中任意组合和的算法实现。通过详细的代码示例,展示了如何从给定的数字集合中选取不同数量的数字并计算其所有可能的和,最后对结果进行排序和去重,确保输出结果的全面性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里求的是一串数字中选任意个数字,输出他们的和。
采用递归思想

#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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值