/*
* 功能:输出一个数组中和为每个指定数的所有组合数
* 日期:2011/7/28
* 作者:milo
* 不足:对于有多个重复数字,会输出重复的组合数,可以通过遍历一个数组链表解决。
*/
#include<stdio.h>
#include<stdlib.h>
int *dst_array,top=0;//中间数组,存放中间求解过程
//打印长度为n的数组元素
static void printA(int *parray,int n)
{
int i;
for(i=0;i<n;i++){
printf("%d ",parray[i]);
}
}
//求解数组sorted_array中数之和为sum所有组合
static void print_array(int *sorted_array,int len,int sum)
{
if(len<1 || sorted_array[0]>sum) return ;//情况一:当前元素大于sum,不符合条件,返回
print_array(sorted_array+1,len-1,sum);//情况二:不包含当前元素的所有和为sum的组合
dst_array[top++]=sorted_array[0];//情况三:包含当前元素
if(sorted_array[0]==sum){//情况三-1:截止到当前元素
printA(dst_array,top);
printf("\n");
top--;
return;
}
print_array(sorted_array+1,len-1,sum-sorted_array[0]);//情况三-2:包含当前元素但尚未截止
top--;//返回前恢复top值
}
//使用qsort的比较函数
static int my_cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int num,*parray;//存放数据的数组,及数组个数
scanf("%d",&num);
parray=(int *)malloc(sizeof(int)*num);
dst_array=(int *)malloc(sizeof(int)*num);
int i;
for(i=0;i<num;i++){//初始化数组
scanf("%d",&parray[i]);
}
qsort(parray,num,sizeof(int),my_cmp);//排序数组
print_array(parray,num,100);//求数组中和为100的所有数的组合
return 0;
}
* 功能:输出一个数组中和为每个指定数的所有组合数
* 日期:2011/7/28
* 作者:milo
* 不足:对于有多个重复数字,会输出重复的组合数,可以通过遍历一个数组链表解决。
*/
#include<stdio.h>
#include<stdlib.h>
int *dst_array,top=0;//中间数组,存放中间求解过程
//打印长度为n的数组元素
static void printA(int *parray,int n)
{
int i;
for(i=0;i<n;i++){
printf("%d ",parray[i]);
}
}
//求解数组sorted_array中数之和为sum所有组合
static void print_array(int *sorted_array,int len,int sum)
{
if(len<1 || sorted_array[0]>sum) return ;//情况一:当前元素大于sum,不符合条件,返回
print_array(sorted_array+1,len-1,sum);//情况二:不包含当前元素的所有和为sum的组合
dst_array[top++]=sorted_array[0];//情况三:包含当前元素
if(sorted_array[0]==sum){//情况三-1:截止到当前元素
printA(dst_array,top);
printf("\n");
top--;
return;
}
print_array(sorted_array+1,len-1,sum-sorted_array[0]);//情况三-2:包含当前元素但尚未截止
top--;//返回前恢复top值
}
//使用qsort的比较函数
static int my_cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int num,*parray;//存放数据的数组,及数组个数
scanf("%d",&num);
parray=(int *)malloc(sizeof(int)*num);
dst_array=(int *)malloc(sizeof(int)*num);
int i;
for(i=0;i<num;i++){//初始化数组
scanf("%d",&parray[i]);
}
qsort(parray,num,sizeof(int),my_cmp);//排序数组
print_array(parray,num,100);//求数组中和为100的所有数的组合
return 0;
}