昨天想了很长时间,没找到好的解决方案!

#include <stdio.h> #include <stdlib.h> #include <conio.h>
void print_array(int *box,int size); void collector(int *box,int pos,int size); int inverse_sum(int *box,int size);
void main() { int box[9]={0};
collector(box,0,9); getch(); }
int inverse_sum(int *box,int size) { int i; int sum=0; for(i=0;i<size;i++) { sum += 1.0/box[i]; } return sum; }
void print_array(int *box,int size) { int i; for(i=0;i<size;i++) { printf("%4d",box[i]); } printf("\n"); }
void collector(int *box,int pos,int size) { if(pos < size && pos >= 0) { int i,j;
for(i=1;i<=100;i++)
{
box[pos]=i;
pos++;
collector(box,pos,size);
pos--;
}
}
else
{
if(inverse_sum(box,size) == 1)
{
print_array(box,size);
}
}
}
三个数字的时候我测试过可以通过,不过9个数字是不是有点太慢了。。。。。。。。。。。。。。(可能会花几天几夜)
[此贴子已经被作者于2005-2-21 17:06:42编辑过]
大体上可以用回溯的方法做。实际上就是把100个整数中选出9个整数的方案全部穷举一遍,逐个验证。(第一遍是1 2 3 4 5 6 7 8 9;第二遍是1 2 3 4 5 6 7 8 10;第。。。。。。)
可以用下面的方法去掉许多不必要的情况:9个数中最小的数一定小于9,所以选取第一个数的时候就可以把它限定在2~~9的范围内。现在不妨先选5。那么剩下的8个倒数的和就成了0.5,0.5/8=0.0625,1/0.0625约为16.13,也就是说,这8个数种必有一个小于或等于16,这样就可把第二小的数的选取范围定在6~~16。照这样下去,每一次选一个数之前都算一下范围,应该可以在短时间内出结果。