给定一个数组,输入m,求出m个数相加的和。
如num[6]={1,2,4,8,16,32};
,
- m=1时,为 1,2,4,8,16,32
- m=2时,为3,5,6,9,10,12,17,18,20,24,33,34,36,40,48.
- . . … … . .
#include<iostream>
#include<set>
using namespace std;
int flag[100];
void dfs(int *num,int m,int sum,int now,set<int>& ans){
if(now>=m){//now是选了几个数
ans.insert(sum);
return;
}
for(int i=0;i<=5;i++)//从num中选出数字
{
if(flag[num[i]]==0){
flag[num[i]]=1;
dfs(num,m,sum+num[i],now+1,ans);
flag[num[i]]=0;
}
}
}
int main(void){
int num[6]={1,2,4,8,16,32};
int m;
cin>>m;
set<int>ans;
int cot=0;
dfs(num,m,0,0,ans);
for(auto a:ans){
cot++;
cout<<a<<endl;
}
cout<<"共"<<cot;
}
主要是用了set去重,否则结果会重复。
但是如果从另一方面来看,当顺序也不同得时候,不去重反而是对的。
比如 1,2 和 2,1 ,虽然相加都是3,但要求 顺序的时候,是不同的。
另一种,当前 i 要往下搜的时候,设置循环的开始为i+1,这样有效避免了重复。
#include<iostream>
#include<vector>
using namespace std;
vector<int>ans;
void dfs(vector<int>& num,int m,int n,int index,int sum){
if(m==0){
ans.push_back(sum);
return;
}
for(int i=index;i<n;i++){
dfs(num,m-1,n,i+1,sum+num[i]);
}
}
int main(void){
vector<int>num={1,2,4,8,16,32};
int m=2;
int n=num.size();
dfs(num,m,n,0,0);
int cot=0;
for(auto a:ans){
cout<<a<<endl;
cot++;
}
cout<<"共"<<cot<<"种";
}