从数组中取出m个数相加的结果(组合)

给定一个数组,输入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<<"种"; 
}
发布了161 篇原创文章 · 获赞 68 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43179428/article/details/105038786