当前位置: 代码迷 >> C语言 >> [求助]如何求出文本中哪些数相加等于指定的值
  详细解决方案

[求助]如何求出文本中哪些数相加等于指定的值

热度:560   发布时间:2007-03-09 17:46:27.0
[求助]如何求出文本中哪些数相加等于指定的值

test.txt


程序代码:
4816
4776
4498
4616
4948
4684
4710
5266
4760
5168
4770
5134
5076
4784
5174
4732
4782
4746
4730
5224
5164
4742
4724
4730
4762
4162
4188
4830
4942
4072
4270
4520
4808
5130
4272
4262
4238
4240
4828
4168
4754
4720
4896
4824
5206
4322
3800
4826
4632
5104
5134
4838
3858
5008
4828
5234
4324
5282
5348
5150
4724
4682
4720
5218
4744
4742
4760
5194
4792
4712
4754
4704

171780
要求:如果有多种组合,依次列出;这72个数中每个数在每种组合中只能用一次。

搜索更多相关的解决方案: 文本  相加  

----------------解决方案--------------------------------------------------------

我的想法是先找出最大数和最小数,然后用171780去除,得到的就是相加的数的个数的取值范围
之后除了挨个算一遍我就想不到更好的办法了。


----------------解决方案--------------------------------------------------------
排序+搜索 应该可以.
----------------解决方案--------------------------------------------------------
2楼观点!
----------------解决方案--------------------------------------------------------
2楼的思路不错,但那是相对,数据少的时侯,
这道程序可最少要有30多个不同的数相加而来的.
挨个算一遍就更烦琐了.
----------------解决方案--------------------------------------------------------
#include "stdio.h"
#define number 171780
main()
{
int data[]={4816,4776,4498,4616,4948,4684,4710,5266,4760,5168,4770,5134,5076,4784,
5174,4732,4782,4746,4730,5224,5164,4742,4724,4730,4762,4162,4188,4830,4942,4072,
4270,4520,4808,5130,4272,4262,4238,4240,4828,4168,4754,4720,4896,4824,5206,4322,
3800,4826,4632,5104,5134,4838,3858,5008,4828,5234,4324,5282,5348,5150,4724,4682,
4720,5218,4744,4742,4760,5194,4792,4712,4754,4704};
int max,min,i;
int num_max,num_min;
max=min=data[0];
for(i=1;i<72;i++)
{
if(max<data[i])
max=data[i];
if(min>data[i])
min=data[i];
}
printf("Max:%d,Min:%d\n",max,min);
num_max=number/min;
num_min=number/max;
printf("num_max:%d,num_min:%d",num_max,num_min);
}

简单算了一下,最多45个,最少32个,如果从32到45排列一遍运算量太大
但是没有想到较好的算法
也许等我学了数据结构才可以解决
----------------解决方案--------------------------------------------------------
研究了两个晚上,还是没有想出什么好的办法,用递归写了个程序,用组合公式算了算,仅仅32个数的和的情况就有3e20个结果,如果再算上从32个到45个计算量不可想像,以下是算32个数的和的程序(10分钟1轮都没走完- -,放弃):
#include "stdio.h"
#define number 171780
long sum[72];
int *p[72];
int num=32; /*定义求多少个数的和*/
int a_width=72; /*定义数组宽度*/
int data[]={4816,4776,4498,4616,4948,4684,4710,5266,4760,5168,4770,5134,5076,4784,
5174,4732,4782,4746,4730,5224,5164,4742,4724,4730,4762,4162,4188,4830,4942,4072,
4270,4520,4808,5130,4272,4262,4238,4240,4828,4168,4754,4720,4896,4824,5206,4322,
3800,4826,4632,5104,5134,4838,3858,5008,4828,5234,4324,5282,5348,5150,4724,4682,
4720,5218,4744,4742,4760,5194,4792,4712,4754,4704};
int comb(int x);
main()
{
int max,min,i;
int num_max,num_min;
max=min=data[0];
for(i=1;i<72;i++)
{
if(max<data[i])
max=data[i];
if(min>data[i])
min=data[i];
}
printf("Max:%d,Min:%d\n",max,min);
num_max=number/min;
num_min=number/max;
printf("num_max:%d,num_min:%d\n",num_max,num_min);

for(i=0;i<72;i++)
{
sum[i]=0;
}
printf("Finding,please wait...\n");
comb(num);
}
comb(int x)
{
int i;
if(x==1)
{
for(p[x-1]=p[x]+1;p[x-1]<(data+a_width);p[x-1]++)
{
sum[x-1]=sum[x]+*p[x-1];
/*for(i=0;i<num-1;i++)
{
printf("\t");
}
printf("%d=%d\n",*p[x-1],sum[x-1]);*/
printf("%ld\t",sum[x-1]);
if(sum[x-1]==number)
{
for(i=num;i>0;i--)
{
printf("%d+",*p[i]);
}
printf("=%ld",number); /*如果找到所求在这里输出*/
}
sum[x-1]=0;
}
}
else if(x==num)
{
for(p[x-1]=data;p[x-1]<=(data+a_width-num);p[x-1]++)
{
sum[x-1]=sum[x]+*p[x-1];
/*printf("%d+\n",*p[x-1]);*/
comb(x-1);
printf("\nThe number %d can be exclude!\n",*p[x-1]);
sum[x-1]=0;
}
}
else
{
for(p[x-1]=p[x]+1;p[x-1]<=(data+a_width-x);p[x-1]++)
{
sum[x-1]=sum[x]+*p[x-1];
/*for(i=0;i<num-x;i++)
{
printf("\t");
}
printf("%d+\n",*p[x-1]);*/
comb(x-1);
sum[x-1]=0;
}
}
}
----------------解决方案--------------------------------------------------------
值得鼓励!
----------------解决方案--------------------------------------------------------
谢楼上!
有没有高手对这个问题给些建议啊,我实在不甘心2个晚上白忙活一场!
----------------解决方案--------------------------------------------------------
这道题莫非真的无解了?
----------------解决方案--------------------------------------------------------
  相关解决方案