其实是个背包问题。
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 if(number==1)
{
cout<<sum;
for(vector<int>::iterator iter=

博客探讨了如何在数列1到n中找到和为m的不同组合。内容涉及多个扩展情况,包括组合个数固定、不重复数组、可重复数组等场景,并强调了在处理可重复数组时需要先对数组进行排序。参考链接提供了更多相关信息。
最低0.47元/天 解锁文章
3946

被折叠的 条评论
为什么被折叠?



