求大神指点一下算法,就加法的问题

图片说明
如图,求大神指点

哎哎哎我也是给自己醉了居然循环了两次。现在应该可以了。采纳啊亲 TAT

#include<stdio.h>
#include<math.h>

double arry[10]; 
double inpath[55];

void init(){
    for(int i = 0; i < 100; i++)
        inpath[i] = 0;  
}

// 快速排序,升序排序 
void quiksort(double a[],int low,int high)
{
    int i = low;
    int j = high;  
    double temp = a[i]; 

    if( low < high)
    {          
        while(i < j) 
        {
            while((a[j] >= temp) && (i < j))
            { 
                j--; 
            }
            a[i] = a[j];
            while((a[i] <= temp) && (i < j))
            {
                i++; 
            }  
            a[j]= a[i];
        }
        a[i] = temp;
        quiksort(a,low,i-1);
        quiksort(a,j+1,high);
    }
    else
    {
        return;
    }
}

void getResult(double sum, int index, double currSum, double *inpath, 
    int step, int NumOfdata){
    int j,k;
    if(fabs(currSum - sum) < 1e-6){
        for(j = 0; j < step - 1; j++){
            printf("%lf", inpath[j]);
            printf("+"); 
        }   
        printf("%lf", inpath[j]);
        printf("\n");
        return ;
    }else if(sum - currSum > 1e-3){
        for(k = index; k < NumOfdata; k++){
                inpath[step] = arry[k];
                getResult(sum, k, currSum + arry[k], inpath, step + 1, NumOfdata);
        }
    }
    else return ;
}

int main(){

    int i;  
    double Sum;
    printf("输入的数据个数:");
    int NumOfdata;
    scanf("%d", &NumOfdata);
    printf("输入数据:");
    for(i = 0; i < NumOfdata; i++) 
        scanf("%lf", &arry[i]);
    quiksort(arry, 0, NumOfdata - 1);
    printf("输入期望的和:");
        scanf("%lf", &Sum);  
    init();
    getResult(Sum, 0, 0, inpath, 0, NumOfdata);
    return 0;
} 

最小数字是0.5
6=12_*0.5
也就是说所有数最多放12份
然后就是排列组合的
穷举法进行验证

如果数据不大的情况下
可以先把输入的数据a[]先排个序,然后用队列,每一次加上a[i],如果加上的值小于所期望的值,则把它push回队列,超过了则抛弃,循环直到队列为空

 #include<stdio.h>
#include<math.h>

double arry[10]; 
double inpath[55];

void init(){
    for(int i = 0; i < 100; i++)
        inpath[i] = 0;  
}

// 快速排序,升序排序 
void quiksort(double a[],int low,int high)
{
    int i = low;
    int j = high;  
    double temp = a[i]; 

    if( low < high)
    {          
        while(i < j) 
        {
            while((a[j] >= temp) && (i < j))
            { 
                j--; 
            }
            a[i] = a[j];
            while((a[i] <= temp) && (i < j))
            {
                i++; 
            }  
            a[j]= a[i];
        }
        a[i] = temp;
        quiksort(a,low,i-1);
        quiksort(a,j+1,high);
    }
    else
    {
        return;
    }
}

void getResult(double sum, int index, double currSum, double *inpath, 
    int step, int NumOfdata, double lastValue){
    int j,k;
    if(fabs(currSum - sum) < 1e-6){
        for(j = 0; j < step - 1; j++){
            printf("%lf", inpath[j]);
            printf("+"); 
        }   
        printf("%lf", inpath[j]);
        printf("\n");
        return ;
    }else if(sum - currSum > 1e-3){
        for(k = index; k < NumOfdata; k++){
            if(arry[k] >= lastValue) {
                inpath[step] = arry[k];
                getResult(sum, index, currSum + arry[k], inpath, step + 1, NumOfdata, arry[k]);
            }
            else continue;
        }
    }
    else return ;
}

int main(){

    int i;  
    double Sum;
    printf("输入的数据个数:");
    int NumOfdata;
    scanf("%d", &NumOfdata);
    printf("输入数据:");
    for(i = 0; i < NumOfdata; i++) 
        scanf("%lf", &arry[i]);
    quiksort(arry, 0, NumOfdata - 1);
    printf("输入期望的和:");
        scanf("%lf", &Sum);  
    for(i = 0; i < NumOfdata; i++){
        init();
        getResult(Sum, i, 0, inpath, 0, NumOfdata, 0);
    }
    return 0;
}

思路:
比如有数据:A、B、C、D、E、F、G、H、、、、
用循环比较:(1)把A拿出来和B相加,如果等于6,就记录下这两个数,不等于6,就和C相加;后面依次。
第一轮循环完成后 (2)第二轮循环,就把B拿出来,和C相加,如果等于6,就记录下这两个数,后面依次。
。。。。。。。。。

图片说明出错了呢,怎么了呢

图片说明
程序是好的,可能编译器的问题?我用的是Cfree。