这个小程序的作用是1-m的数字列表中取n个数字的所有组合的输出,用到的思想应该算是1/0背包问题的思路吧。
#include "stdafx.h"
#include<iostream>
using namespace std;
int leng;
void print(int flag[])
{
for(int i=0;i<leng;i++)
{
if(flag[i]==1)
cout<<i+1<<" ";
}
cout<<endl;
}
void find(int m,int n,int flag[])
{
if(n<1)
{
print(flag);
return;
}
if(m<1||m<n)
return;
flag[m-1]=1;
find(m-1,n-1,flag);
flag[m-1]=0;
find(m-1,n,flag);
}
int num(int m,int n)
{
int temp=1,temp2=1;
for(int i=0;i<n;i++)
temp*=m--;
for(int i=1;i<=n;i++)
temp2*=i;
return temp/temp2;
}
int _tmain(int argc, _TCHAR* argv[])
{
int m,n;
cout<<"请您输入要计算的范围(m)和数量(n):";
cin>>m>>n;
cout<<endl;
leng=m;
cout<<"1-"<<m<<"中取"<<n<<"个数的组合总共有"<<num(m,n)<<"种:"<<endl;
int *flag=(int *)malloc(sizeof(int)*n);
memset(flag, 0, sizeof(flag));
find(m,n,flag);
free(flag);
return 0;
}