/*
从n中选出m个数
*/
#include <stdio.h>
int m = 0;
int n = 0;
char* malloc_and_copy_path(int,char*,int);
void memset(char* arr,int length,char value);
/*
*/
void select(char *path,int length,int need,int i,int* total){
if(need == 0){ //I will reduce need to zero and path is correct
//print path
printf("one possible:");
int k = 0;
for(;k<i;k++){
printf("%d,",path[k]);
}
for(k=i;k<length;k++){
printf("0,");
}
printf("\n");
free(path);
(*total)++;
return ;
}
if(need > length - i){ // no more data
free(path); // free data
return ;
}
char* t1 = malloc_and_copy_path(length,path,i+1);
t1[i] = 1 ; // use this value
select(t1,length,need-1,i+1,total);
char* t2 = malloc_and_copy_path(length,path,i+1);
t2[i] = 0; // don't use this value
select(t2,length,need,i+1,total);
}
char* malloc_and_copy_path(int size,char* c,int length){
char* t = malloc(size);
int i = 0;
for(;i<length;i++){
t[i] = c[i];
}
return t;
}
void memset(char* arr,int length,char value){
int i;
for(i=0;i<length;i++){
*(arr+i) = value;
}
}
int main(void)
{
int total = 0;
for(;;){
printf("#############################\n");
printf("Please input n:\n");
scanf("%d",&n);
printf("Please input m:\n");
scanf("%d",&m);
printf("m=%d n=%d\n",m,n);
if(m < 0 || n<0 || m>=n){
printf("Illege input\n");
return ;
}
char* arr = (char*)malloc(sizeof(char) * n);
memset(arr,n,0); // looks like I don't need this
total = 0;
select(arr,n,m,0,&total);
free(arr);
printf("%d\n\n\n\n",total);
}
return 0;
}