其实是个背包问题。
void FindSum(int sum, int n)//1到n和为m的所有组合
{
static vector<int> l;
if(n<=0 || sum<=0 )
return;
if(sum>n)
{
l.push_back(n);
FindSum(sum-n, n-1);
l.pop_back();
FindSum(sum, n-1);
}
else
{
cout<<sum;
for(vector<int>::iterator iter=l.begin(); iter!=l.end();iter++)
cout<<" "<<*iter;
cout<<endl;
//上面部分得到的是一种情况,但是还存在另一种情况,我们需要找出从 1 到 sum - 1 里面是否存在值,它们的和等于sum
if(sum!=1)
FindSum(sum, sum-1);
}
}
扩展一:要求组合的个数一定
void FindSum1(int sum, int n, int number)//1到n中number个数和为m的所有组合
{
static vector<int> l;
if(sum<=0 || n<=0 || number<=0 || n<number)
return;
if(sum>n)
{
l.push_back(n);
FindSum1(sum-n, n-1, number-1);
l.pop_back();
FindSum1(sum, n-1, number);
}
else