其实是个背包问题。
- voidFindSum(intsum,intn)//1到n和为m的所有组合
- {
- staticvector<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>::iteratoriter=l.begin();iter!=l.end();iter++)
- cout<<""<<*iter;
- cout<<endl;
- //上面部分得到的是一种情况,但是还存在另一种情况,我们需要找出从1到sum-1里面是否存在值,它们的和等于sum
- if(sum!=1)
- FindSum(sum,sum-1);
- }
- }
扩展一:要求组合的个数一定
- voidFindSum1(intsum,intn,intnumber)//1到n中number个数和为m的所有组合
- {
- staticvector<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);
- }
- elseif(number==1)
- {
- cout<<sum;
- for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
- cout<<""<<*iter;
- cout<<endl;
- }
- else
- {
- if(sum!=1)
- FindSum1(sum,sum-1,number);
- }
- }
扩展二:给定不重复数组a, 求数组a中number个数和为sum的所有组合,其中n为(数组长度-1)
- voidFindSum2(int*a,intsum,intn,intnumber)//给定不重复数组a,求数组a中number个数和为sum的所有组合,其中n为(数组长度-1)
- {
- staticvector<int>l;
- if(number==0&&sum==0)
- {
- for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
- cout<<*iter<<"";
- cout<<endl;
- return;
- }
- if(sum<0||n<0||n<number-1)
- return;
- l.push_back(a[n]);
- FindSum2(a,sum-a[n],n-1,number-1);
- l.pop_back();
- FindSum2(a,sum,n-1,number);
- }
扩展三:不重复数组中和等于sum的所有组合,n是(数组的长度-1)
- voidFindSum3(int*a,intsum,intn)//不重复数组中和等于sum的所有组合,n是(数组的长度-1)
- {
- staticvector<int>l;
- if(sum==0)
- {
- for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
- cout<<*iter<<"";
- cout<<endl;
- return;
- }
- if(sum<0||n<0)
- return;
- l.push_back(a[n]);
- FindSum3(a,sum-a[n],n-1);
- l.pop_back();
- FindSum3(a,sum,n-1);
- }
扩展四:给定可重复数组a(首先要将数组a排序,递增递减都可以), 求数组a中number个数和为sum的所有组合,其中n为(数组长度-1)
- voidFindSum4(int*a,intsum,intn,intnumber)//给定可重复数组a(首先要将数组a排序,递增递减都可以),求数组a中number个数和为sum的所有组合,其中n为(数组长度-1)
- {
- staticvector<int>l;
- if(number==0&&sum==0)
- {
- for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
- cout<<*iter<<"";
- cout<<endl;
- return;
- }
- if(sum<0||n<0||n<number-1)
- return;
- l.push_back(a[n]);
- FindSum4(a,sum-a[n],n-1,number-1);
- l.pop_back();
- if(a[n]==a[n-1])
- return;
- FindSum4(a,sum,n-1,number);
- }
扩展五:可重复数组(首先要将数组a排序,递增递减都可以)中和等于sum的所有组合,n是(数组的长度-1)
- {
- staticvector<int>l;
- if(sum==0)
- {
- for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
- cout<<*iter<<"";
- cout<<endl;
- return;
- }
- if(sum<0||n<0)
- return;
- l.push_back(a[n]);
- FindSum5(a,sum-a[n],n-1);
- l.pop_back();
- if(a[n]==a[n-1])
- return;
- FindSum5(a,sum,n-1);
- }