2017校招-求和

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

输入描述:
每个测试输入包含2个整数,n和m

输出描述:
按每个组合的字典序排列输出,每行输出一种组合

示例1
输入
5 5
输出
1 4
2 3
5

解题思路:采用dfs深度+剪枝

#include<iostream>
#include<vector>
using namespace std;
vector<int>jilu(1000);
int n,m,xiabiao=0,sum=0; // xiabiao是传入的数应该放的下标位置
void dfs(int x)
{
 jilu[xiabiao] = x; //将x放入记录中
 sum += x;
 if(sum == m) // 如果相等就输出
 {
  for(int i = 1;i <= xiabiao;i++)//i从1开始,保证不输出0
  {
   if(i != xiabiao)cout << jilu[i] << " ";//注意输出的格式,末尾不能有空格
   else cout << jilu[i];
  }
  cout << endl;
  return;
 }
 else if(sum > m)// 如果当前加上x,大于m就要返回
 {
  return;
 }
 else
 {
  for(int i = x+1;i <= n;i++)//递归判断
  {
   xiabiao++;
   dfs(i);
   sum-=i;
   xiabiao--;
  }
 }
}
int main()
{
 cin >> n >> m;
 dfs(0);  // 从0开始,输出的时候不输出0
}

猜你喜欢

转载自blog.csdn.net/weixin_40936298/article/details/82949029
今日推荐