输入两个整数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;
}