每日一题——递归/非递归实现组合型枚举
题目
题解
可以参考上一题的递归代码,思路是一样的,也是拿个数组存储是否选了该位,多了一个参数记录选了几个,若选了cnt+1,否则直接cnt不变化。
注意观察递归从非递归是如何变化的。
参考代码(递归)
#include<iostream>
using namespace std;
const int N = 25;
int n, m;
bool st[N];
void dfs(int u, int cnt){
if(u == n + 1 && cnt == m){
for(int i = 1; i <= n; i ++)
if(st[i]) cout << i << " ";
puts("");
return;
}
if(u > n) return;
st[u] = true;
dfs(u + 1, cnt + 1);
st[u] = false;
dfs(u + 1, cnt);
}
int main(){
cin >> n >> m;
dfs(1,0);
return 0;
}
参考代码(递归)
#include <iostream>
using namespace std;
int n, m;
void dfs(int u, int sum, int state)
{
if ( sum + n - u < m ) return;
if (sum == m)
{
for (int i = 0; i < n; i ++ )
if (state >> i & 1)
cout << i + 1 << ' ';
cout << endl;
return;
}
dfs(u + 1, sum + 1, state | 1 << u );
dfs(u + 1, sum, state);
}
int main()
{
cin >> n >> m;
dfs(0, 0, 0);
return 0;
}
参考代码(非递归)
#include<iostream>
#include<stack>
using namespace std;
int n, m;
struct State{
int pos, u, sum, state;
};
/*
void dfs(int u, int sum, int state)
{
# 0:
if ( sum + n - u < m ) return;
if (sum == m)
{
for (int i = 0; i < n; i ++ )
if (state >> i & 1)
cout << i + 1 << ' ';
cout << endl;
return;
}
dfs(u + 1, sum + 1, state | 1 << u );
# 1:
dfs(u + 1, sum, state);
# 2:
}
*/
int main()
{
cin >> n >> m;
stack<State> stk;
stk.push({0, 0, 0, 0});
while(stk.size()){
auto t = stk.top();
stk.pop();
if(t.pos == 0){
if ( t.sum + n - t.u < m ) continue;
if (t.sum == m)
{
for (int i = 0; i < n; i ++ )
if (t.state >> i & 1)
cout << i + 1 << ' ';
cout << endl;
continue;
}
t.pos = 1;
stk.push(t);
stk.push({0, t.u + 1, t.sum + 1, t.state | 1 << t.u });
}else if(t.pos == 1){
t.pos = 2;
stk.push(t);
stk.push({0, t.u + 1, t.sum, t.state});
}else continue;
}
// dfs(0, 0, 0);
return 0;
}

浙公网安备 33010602011771号