求和(1,2,3.....n使其和为m的所有情况)

柔光的暖阳◎ 2022-06-10 08:40 283阅读 0赞

输入两个整数 n 和 m,从数列1,2,3…….n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来

输入描述:
  1. 每个测试输入包含2个整数,nm
输出描述:
  1. 按每个组合的字典序排列输出,每行输出一种组合

示例1

输入

  1. 5 5

输出

1 4

2 3

5

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. vector<int> v;
  6. void find_ans(vector<int> ret, int cur_pos, int n, int cur_sum, int sum) {
  7. if (cur_pos >= n) return ;
  8. cur_sum += v[cur_pos];
  9. ret.push_back(v[cur_pos]);
  10. if (cur_sum == sum) {
  11. for (int i = 0; i < ret.size() - 1; ++i) {
  12. cout << ret[i] << " ";
  13. }
  14. cout << ret[ret.size() - 1];
  15. cout << endl;
  16. return ;
  17. } else if (cur_sum > sum) { // 大于sum,就没必要再继续往下了,剪枝操作
  18. return ;
  19. }
  20. // 把当前的下标位置的值放进去,继续下一个位置
  21. find_ans(ret, cur_pos+1, n, cur_sum, sum);
  22. // 不要当前值,从下一个位置搜索,意思大概就是不从1开始找了,从2开始找
  23. vector<int>::iterator it = ret.end();
  24. --it;
  25. ret.erase(it);
  26. find_ans(ret, cur_pos+1, n, cur_sum - v[cur_pos], sum);
  27. // 总体思想就是当前位置的数是要还是不要的事情,列出来所有的可能,挨个输出就行了
  28. }
  29. int main() {
  30. int n, num;
  31. cin >> n >> num;
  32. for (int i = 0; i < n; ++i) {
  33. v.push_back(i+1);
  34. }
  35. // 因为如果n大于num的话,那么num后面的数字肯定不需要再考虑了,所以我们只需要考虑从1~num之间的可能组合就行了
  36. if (n >= num) n = num;
  37. vector<int> ret;
  38. int sum = 0;
  39. // 利用递归的方法来做,0是当前位置,n是最大下标,sum是当前和,num就是要求的结果
  40. find_ans(ret,0,n,sum,num);
  41. return 0;
  42. }

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读