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
}