输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.

来源:互联网 发布:伊朗女孩 知乎 编辑:程序博客网 时间:2024/05/16 23:49

新手学习编程,简单的递归,把所有的分支都遍历到。细节的调试也稍微花了一点时间。

#include<iostream>
using namespace std;
int *flag = NULL;
int n,m;
void PrintOut(int index)
{
 int i;
 for(i=1;i<index;++i)
 {
  if(flag[i])
   cout<<i<<" ";
 }
 cout<<endl;
}
void BagProblem(int sum,int index)

 if(sum == m)
 {
  PrintOut(index);
  return;
 }
 if(index>n || sum>m)
  return ;
 flag[index] = 0;
 BagProblem(sum,index+1);
 flag[index] = 1;
 BagProblem(sum+index , index+1);
}
int main()
{
 
 while(scanf("%d%d",&n,&m)==2)
 {
  if(m<=0)
   continue;
  if(n>=m)
  {
   cout<<m<<endl;;
   n = m-1;
  }
  if(n<=0)
   continue;
  flag = (int *)malloc((n+1)*sizeof(int));
  memset(flag,0,(n+1)*sizeof(int));
  BagProblem(0,1);
  free(flag);
  flag = NULL;
 }
 return 0;
}

原创粉丝点击