伪代码:
#include<iostream>
using namespace std;
const int N = 30;
int n, r;
因为要打印方案:所以说开一个数组记录方案
参数表示第u个数,第u个位置上 _ _ _ 。
void dfs(int u, int last)
{
当r个数选满了以后,就该输出方案了!
计算方式:每个位置上的数都是 1~n中选,一共r个位置,每个位置 n 种选法,所以这里,位置是阶段的递推!
这里采用了last变量,记录了上一个数是多少,那么last后面位置上的数只能比它大,这里利用不降原则枚举去重了所有的元素。
}
int main()
{
cin >> n >> r;
从n个数中选r个数,等于r个数,枚举每个数是什么。
等价于r个位置,每个位置上放哪个数。
所以从第一个位置上开始枚举!
return 0;
}
源代码:
#include<iostream>
#include<iomanip>
using namespace std;
int n, r;
//因为要打印方案:所以说开一个数组记录方案
int path[31];
//参数表示第u个数,第u个位置上 _ _ _ 。
void dfs(int u, int last)
{
// 当r个数选满了以后,就该输出方案了!
if (u > r)
{
for (int i=1; i <= r; i ++)
cout << setw(3) << path[i];
puts("");
return ;
}
// 计算方式:每个位置上的数都是 1~n中选,一共r个位置,每个位置 n 种选法,所以这里,位置是阶段的递推!
for (int i=last; i <= n; i ++) //递推n个物品!即枚举前n个数!
{
path[u] = i;
dfs(u+1, i+1);
}
}
int main()
{
cin >> n >> r;
// 从n个数中选r个数,等于r个数,枚举每个数是什么。
// 等价于r个位置,每个位置上放哪个数。
// 所以从第一个位置上开始枚举!
dfs (1, 1);
return 0;
}