您的位置:首页 > 职场人生

2010年中兴面试题

2016-03-22 19:14 211 查看
输入两个整数n和m,从数列1、2、3…….n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来。

Answer:第一眼反应就是DFS,其中需要考虑的问题是去除重复的组合,其他没什么难度,简单的DFS

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <cstring>
#include <string.h>
using namespace std;
#define M 10000
int flag[M];        //标记已经使用的数
int num[M];         //存1~N
int m,n;
void show()         //输出
{
for(int i = 1; i <= n; i++)
{
if(flag[i])
printf("%d ",num[i]);
}
printf("\n");
}
void DFS(int po)
{
if(m == 0)          //当m等于0,说明已经找到一个组合
{
show();
}
if(m < 0)
return;
for(int i = po; i <= n; i++)
{
if(!flag[i])        //只有没被用过的数才能被加入到组合中
{
m -= num[i];
flag[i] = 1;
DFS(i+1);       //去除重复的组合
m += num[i];
flag[i] = 0;
}

}
}
int main()
{
scanf("%d%d",&n,&m);
memset(num,0,sizeof(num));
memset(flag,0,sizeof(flag));
for(int i = 1; i <= n; i++)
num[i] = i;
DFS(1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: