- 是否看了题解找思路
1.问题分析
简单的dfs,但是题解中用数组的0号位置存放数组的长度第一次见。
核心代码:
for (int i=x;i<=n;i++)
{
p[++p[0]]=i;
dfs(i+1);
p[p[0]--]=0;
}
其实稍加思索,本题就可以用二进制位运算来存储状态。
核心代码(不是自己写的):
void dfs(int x,int now,int date)
{
if (x>n || date+(n-x+1)<m)
return ;
if (date==m)
{
for (int i=1;i<=n;i++)
if (now>>(i-1) & 1)
cout<<i<<" ";
puts("");
return ;
}
dfs(x+1,now+(1<<x),date+1);
dfs(x+1,now,date);
}
2.具体代码
#include <iostream>
using namespace std;
int n,m,p[100];
void dfs(int x)
{
if(p[0]==m)//p[0]存的是长度
{
for(int j=1;j<=p[0];j++) cout<<p[j]<<" ";
cout<<endl;
}
else
{
for(int i=x;i<=n;i++)
{
p[++p[0]]=i;
dfs(i+1);
p[0]--;
}
}
}
int main()
{
cin>>n>>m;
dfs(1);
return 0;
}
3.总结
天天天天划水划水
本文深入解析了使用递归和位运算解决组合型枚举问题的方法,通过具体的代码示例展示了如何利用这两种技术进行状态存储和遍历,特别关注于《算法竞赛进阶指南》中的相关知识点。
285

被折叠的 条评论
为什么被折叠?



