回 帖 发 新 帖 刷新版面

主题:C语言简单习题求解

我是一个初学者,在工作中不得不用C语言,请各位老师指教.我的大概意思是这样的:
假如:1=3,2=5,3=0,4=1,5=12,6=0,7=0,8=2,9=2,10=6,11=3,12=2,1-12个数任意4个数排列的和是10的组合有多少组?其实还有很多组,我这里做了个假设,谢谢各位。

回复列表 (共1个回复)

沙发

[code=c]
#include <stdio.h>
#include <conio.h>
#define MAX 13
#define SUM 10
#define NEED 3

typedef struct Record_Max //定义一个结构,rec记录a[i]中的i值,num记录a[i]的值 
{
    int rec;
    int num;
}Record[NEED];


int judge_sum(Record rd, int ct);  //判断存储结构数组中和值与10的大小关系 

int main(int argc, char *argv[])
{
    Record rd;
    int a[MAX];
    int ct, k, flag;
    a[1]=3;     a[2]=5;
    a[3]=0;     a[4]=1;
    a[5]=12; a[6]=0;
    a[7]=0;  a[8]=2;
    a[9]=2;  a[10]=6;
    a[11]=3; a[12]=2;  //这里可以实现输入赋值 
    
    ct = 0;
    
    rd[ct].rec = 1;
    rd[ct].num = a[1]; //初始化,参见回溯法 
    while(1)
    {
        flag = 1;
        for(k = 0; k < ct; k++) //检验新值是否满足要求 
        {
            if(rd[k].rec == rd[ct].rec || judge_sum(rd, ct) == 0) //如果前面存储的 和值>10了,说明尝试的i不符合要求 
            {
                flag = 0;
                break;
            }
        }    
        if(flag == 1 && ct == NEED && judge_sum(rd, ct) == 1)  //如果满足要求了,即4个数的和为10,可以输出一组解了 
        {
            for(k = 0; k <= NEED; k++)
            {
                printf("%d(%d)  ", rd[k].rec, rd[k].num);
            }
            putchar('\n');
            getch();
        }
        if(flag == 1 && ct < NEED && judge_sum(rd, ct) == 2) //如果当前i满足要求,且ct < NEED ,和值 <10,再往后试解 
        {
            ct++;
            rd[ct].rec = 1;
            rd[ct].num = a[1];
            continue;    
        }    
        
        while(rd[ct].rec == MAX - 1 && ct >= 0) //如果尝试解的过程中i == 12了且当前赋值不满足要求,往前回溯 
        {
            ct--;
        }
        if(ct < 0) //尝试完所有解,退出 
        {
            break;
        }
        else      //否则rec = i+1,num = a[i+1]往后依次试 
        {
            rd[ct].rec ++;
            rd[ct].num = a[rd[ct].rec];
        }
    }
    return 0;
}

int judge_sum(Record rd, int ct)
{
    int i, sm;
    for(sm = 0,i = 0; i <= ct; i++)
    {
        sm += rd[i].num;    
    }
    if(sm == SUM)
    {
        return 1;
    }
    else if(sm < SUM)
    {
        return 2;
    }
    return 0;
}
[/code]
写得很乱,如果lz有什么不懂,可以再找我。

我来回复

您尚未登录,请登录后再回复。点此登录或注册