主题:C语言简单习题求解
xjwszll
[专家分:0] 发布于 2011-06-09 16:18:00
我是一个初学者,在工作中不得不用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个回复)
沙发
fragileeye [专家分:1990] 发布于 2011-06-10 10:55:00
[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有什么不懂,可以再找我。
我来回复