题目地址分别为:
http://contest-hunter.org:83/contest/0x00「基本算法」例题/0301 递归实现指数型枚举
http://contest-hunter.org:83/contest/0x00「基本算法」例题/0302 递归/非递归实现组合型枚举
http://contest-hunter.org:83/contest/0x00「基本算法」例题/0303 递归实现排列型枚举
第一题:
注意 对于没有选任何数的方案,输出空行
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define eps 1e-8
using namespace std;
int ans[20];
int n;
void dfs(int i,int x)
{
if(i==n+1)
{
for(int i=0;i<x;i++)
{
if(i!=x-1)
printf("%d ",ans[i]);
else
printf("%d",ans[i]);
}
printf("\n");
return ;
}
dfs(i+1,x);
ans[x++]=i;
dfs(i+1,x);
x--;
}
int main()
{
scanf("%d",&n);
dfs(1,0);
return 0;
}
第二题:
因题目要求 字典序较小的排在前面(例如1 3 9 12排在1 3 10 11前面)。
注意在递归函数里,将存数据的递归放在前面,不存数据的递归放在后面。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define eps 1e-8
using namespace std;
int ans[20];
int n,m;
void dfs(int i,int x)
{
if(i==n+1)
{
if(x==m)
for(int i=0;i<x;i++)
{
if(i!=x-1)
printf("%d ",ans[i]);
else
printf("%d\n",ans[i]);
}
return ;
}
ans[x++]=i;
dfs(i+1,x);
x--;///要将数据存入放在前面
dfs(i+1,x);///不放数据放在后面
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1,0);
return 0;
}
第三题:
问题:把指定的n个整数按照任意次序排序,在每次递归中,我们尝试把每个可用的数作为数列中的下一个数,求解“把剩下的n-1个整数按照任意次序排序”这个规模更小的子问题。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define eps 1e-8
using namespace std;
int ans[20];
bool choose[20];
int n,m;
void dfs(int x)
{
if(x==n)
{
for(int i=0;i<n;i++)
{
if(i!=n-1)
printf("%d ",ans[i]);
else
printf("%d\n",ans[i]);
}
return ;
}
for(int i=1;i<=n;i++)
{
if(!choose[i])
{
ans[x++]=i;
choose[i]=1;
dfs(x);
x--;///到达边界后,这种状态已经结束了,将其清空
choose[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
dfs(0);
return 0;
}