#求1到n中取几个数使和为m
#include <iostream>
using namespace std;
//记录符合条件的组合个数
int pcount = 0;
/** \brief 输出符合条件的数组
*
* \param int a[] 保存有符合条件的数组
* \param int n 数组大小
* \return void
*/
void printRes(int a[],int n){
for(int i = 0; i < n; i++){
cout<<a[i]<<' ';
}
cout<<endl;
}
/** \brief 递归处理计算符合条件的数组
* \param int n 1到n的n
* \param int n1 判断是否是符合条件的数
* \param int m 符合条件的数的和
* \param int a[] 记录符号条件的数的数组
* \param int ai 符合条件数组的下标
* \param int sum 当前符合条件数组中数的和
* \return void
*/
void dealNM(int n,int n1,int m,int a[],int ai,int sum){
for(int i = n1; i <= n; i++){
if(sum + i == m){//已经符合条件则打印输出数组
a[ai] = i;
pcount++;
printRes(a,ai+1);
}
if(sum + i < m){
sum += i;
a[ai] = i;
//开始递归求值
dealNM(n,i+1,m,a,ai+1,sum);
//还原,回溯
sum -= i;
a[ai] = 0;
}
if(sum + i > m){//总和超过m,跳出循环准备回溯
break;
}
}
}
int main()
{
int n,m;
cout<<"input n m : ";
cin>>n>>m;
int a[10000] = {0};//初始化数组,用来保存结果
dealNM(n,1,m,a,0,0);
cout<<"total num : "<<pcount<<endl;
cout << "Hello world!" << endl;
return 0;
}
10.30下午去面试碰到的笔试题,好久没写c++了,当时没写出来,真是败笔