从数列1,2,3.......n 中 随意取几个数,使其和等于 m

其实是个背包问题。

  1. voidFindSum(intsum,intn)//1到n和为m的所有组合
  2. {
  3. staticvector<int>l;
  4. if(n<=0||sum<=0)
  5. return;
  6. if(sum>n)
  7. {
  8. l.push_back(n);
  9. FindSum(sum-n,n-1);
  10. l.pop_back();
  11. FindSum(sum,n-1);
  12. }
  13. else
  14. {
  15. cout<<sum;
  16. for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
  17. cout<<""<<*iter;
  18. cout<<endl;
  19. //上面部分得到的是一种情况,但是还存在另一种情况,我们需要找出从1到sum-1里面是否存在值,它们的和等于sum
  20. if(sum!=1)
  21. FindSum(sum,sum-1);
  22. }
  23. }
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); } }


扩展一:要求组合的个数一定

  1. voidFindSum1(intsum,intn,intnumber)//1到n中number个数和为m的所有组合
  2. {
  3. staticvector<int>l;
  4. if(sum<=0||n<=0||number<=0||n<number)
  5. return;
  6. if(sum>n)
  7. {
  8. l.push_back(n);
  9. FindSum1(sum-n,n-1,number-1);
  10. l.pop_back();
  11. FindSum1(sum,n-1,number);
  12. }
  13. elseif(number==1)
  14. {
  15. cout<<sum;
  16. for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
  17. cout<<""<<*iter;
  18. cout<<endl;
  19. }
  20. else
  21. {
  22. if(sum!=1)
  23. FindSum1(sum,sum-1,number);
  24. }
  25. }
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=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)

  1. voidFindSum2(int*a,intsum,intn,intnumber)//给定不重复数组a,求数组a中number个数和为sum的所有组合,其中n为(数组长度-1)
  2. {
  3. staticvector<int>l;
  4. if(number==0&&sum==0)
  5. {
  6. for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
  7. cout<<*iter<<"";
  8. cout<<endl;
  9. return;
  10. }
  11. if(sum<0||n<0||n<number-1)
  12. return;
  13. l.push_back(a[n]);
  14. FindSum2(a,sum-a[n],n-1,number-1);
  15. l.pop_back();
  16. FindSum2(a,sum,n-1,number);
  17. }
void FindSum2(int *a, int sum, int n, int number)//给定不重复数组a, 求数组a中number个数和为sum的所有组合,其中n为(数组长度-1) { static vector<int> l; if(number==0 && sum==0) { for(vector<int>::iterator iter=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)

  1. voidFindSum3(int*a,intsum,intn)//不重复数组中和等于sum的所有组合,n是(数组的长度-1)
  2. {
  3. staticvector<int>l;
  4. if(sum==0)
  5. {
  6. for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
  7. cout<<*iter<<"";
  8. cout<<endl;
  9. return;
  10. }
  11. if(sum<0||n<0)
  12. return;
  13. l.push_back(a[n]);
  14. FindSum3(a,sum-a[n],n-1);
  15. l.pop_back();
  16. FindSum3(a,sum,n-1);
  17. }
void FindSum3(int *a, int sum, int n)//不重复数组中和等于sum的所有组合,n是(数组的长度-1) { static vector<int> l; if(sum==0) { for(vector<int>::iterator iter=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)

  1. voidFindSum4(int*a,intsum,intn,intnumber)//给定可重复数组a(首先要将数组a排序,递增递减都可以),求数组a中number个数和为sum的所有组合,其中n为(数组长度-1)
  2. {
  3. staticvector<int>l;
  4. if(number==0&&sum==0)
  5. {
  6. for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
  7. cout<<*iter<<"";
  8. cout<<endl;
  9. return;
  10. }
  11. if(sum<0||n<0||n<number-1)
  12. return;
  13. l.push_back(a[n]);
  14. FindSum4(a,sum-a[n],n-1,number-1);
  15. l.pop_back();
  16. if(a[n]==a[n-1])
  17. return;
  18. FindSum4(a,sum,n-1,number);
  19. }
void FindSum4(int *a, int sum, int n, int number)//给定可重复数组a(首先要将数组a排序,递增递减都可以), 求数组a中number个数和为sum的所有组合,其中n为(数组长度-1) { static vector<int> l; if(number==0 && sum==0) { for(vector<int>::iterator iter=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)

voidFindSum5(int*a,intsum,intn)//可重复数组(首先要将数组a排序,递增递减都可以)中和等于sum的所有组合,n是(数组的长度-1)
  1. {
  2. staticvector<int>l;
  3. if(sum==0)
  4. {
  5. for(vector<int>::iteratoriter=l.begin();iter!=l.end();iter++)
  6. cout<<*iter<<"";
  7. cout<<endl;
  8. return;
  9. }
  10. if(sum<0||n<0)
  11. return;
  12. l.push_back(a[n]);
  13. FindSum5(a,sum-a[n],n-1);
  14. l.pop_back();
  15. if(a[n]==a[n-1])
  16. return;
  17. FindSum5(a,sum,n-1);
  18. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值