数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 11852|回复: 4

求一个算法

  [复制链接]
发表于 2007-10-28 20:10:16 | 显示全部楼层 |阅读模式
现有1224个一维数组,维数都是一维的,每个数组里元素个数在2到18个之间。这1224个一维数组,四个为一组,一组里面的四个一维数组是由同一个数据演变而来的,同一个数据只能用一次,所以四个一维数组中有一个被用上了,其他三个就不能用了。将这375个数据(由1500除以4得来),加上不同的数(如加787),按一定的顺序用上(生成参照数中没有数据,并将改数据加入到参照数中),使得能够产生参数中没有的数据(参照数是在参照数文件中,从13000到13999之间所有的1000个整数,现在只有672个),并且不重复,13000到13999之间的1000个数字,375个数据肯定不会全部用上的,最终只要得出按顺序使用一维数组的组号即可(按1500个数组在文件中排列的顺序就是数组的组号)。

说明:
该运算的作用:用这1500个数组生成的数字将13000到13999缺的数字填满,然后得出使用数组的顺序号。
每个数组只能装18个数字。
数组中最大的数是13888,最小数是13111。
参照数字中最大的数是13999,最小的数是13000。
一个数组如果产生了与参照数字相同的数,这个数组就不能再用了,而且四个为一组的,四个一维数组都不能用了。

说明一:当四个四个一组的一维数组中,经过运算,四个一维数组产生的数都没有被加进参照数字里面,那么这四个一维数组,下次还要被用到。例如,第一到第四个数组产生的数都没有被加进参照数字里面,而第五到第八个一维数组产生的数有被加进参照数字里面,那么下次就相当于还有第9到第1500个一维数组,再加上第1到第4个一维数组,可以拿来用。

说明二:当出现13000到13999之中还有数字没被检测到,而剩下的所有一维数组产生的数又和参照数字里的数有相等或者说重复了,那么就说明按照前面的顺序,参照数字里已经不可能达到既有13000到13999的全部数又没有重复的目的了,那么说明前面有些顺序不对了,所以就要退回上一级,并且从参照数字里面去掉上一次刚加进去参照数字里面的数字,退回上一级别,用后面的数组去试试看,依次类退,依次退回上一级,再用别的去试,直到达到结果。

说明三:1500个数组里的每一个数经过加上某一个数后,加上去后的最大数不能大于13998,也不能小于13100。如果大于13998或者小于13100了,就用下一个一维数组。(这里会和上面的参照数字只有那么几个,而要求又要有13000到13999的所有数字,这里不会矛盾的,因为参照数里还有很多数,我没写出来)

说明四:当1500个数组中原来的最大的数字就比要得到的13000到13999之间的目标数大时,那么这一个一维数组就用不上了,就用下一个一维数组,比如13999,13998,13997都有了,那下面要是没有13996,那我们就要通过加某个数以后得到13996,这时候,要是没加某个数以前,原来数组中最大的数字,就比13996大,那么这个数组就不用了,就用下一个

现在有一种算法如下(是用微机进行计算的算法):
程序开始运行,先检测参照数字里面有没有13999,参照数字是这些: 13788,13787,13998,13999。会有两种检测结果:第一种结果是如果检测到有13999,那么再检测有没有13999减1的数字(就是13998),如果检测到有13998,那么再检测13998减1的数字(就是13997),依次类推,一直到检测到参照数字中连13000也有了(也就是13000到13999这一千个数字都有了),则停止运行,输出程序运行结果,完成;第二种结果是如果检测到没有13999,那么从1500个一维数组中,读出第一个数组(13111,13211),将读出来的数组(13111,13211)中的每一个数,都加上一个数(13999减1,再减去那个一维数组中最大的数字13211),也就是说加上787,加上以后,就有了两个数13998(由13211加787得出)和13897(由13111加787得出),然后看看那些参照数字中有没有13998或者有没有13897,这里又有两种情况:A情况:如果参照数字中有13998或者13897中的任何一个,那么读出下一个一维数组,就是读出第二个一维数组(13111,13112,13211,13221,13311,13321,13312,13322,13421),将这个一维数组中的每一个数都加上一个数(13999减1,再减去那个一维数组中最大的数字13421),有也就是说都加上577,会分别得出数字:13688(由13111加577得出)、13689、13788、13798、13888、13898、13889、13899、13998。再看看参照数字中是否有数字和13688(有13111加577得出)、13689、13788、13798、13888、13898、13889、13899、13998中的任何一个相等,如果相等,则读出下一个一维数组来,……。
B情况:如果参照数字中没有13998或者13897中的任何一个,那么将13998和13897都加进参照数字中,下一次的参照数字中就变成了13788,13787,13998,13999,13998,13897。也就是说随着程序的运行,参照数字是会变的,会增加的。13998和13897加进参照数字里面以后,第一个一维数组到第四个一维数组就不能再用了,因为四个一维数组是为一组的,是同一个数据演变而来的,我按顺序,四个四个放在一起。不能同时重复用。
接下来13998和13897加进参照数字里面以后,接下来,又开始检测参照数字中有没有13999(也可以直接检测刚加进参照数字中最大的数字,也就是从13998开始,这样省去检测13999,因为13999已经检测过有了,总之要使参照数字中有13000到13999之间的所有数字)。接下来,会检测到有13999、13998,而检测到没有13997,那么读出第五个一维数组(备注:这里就要用第五个一维数组了,而不能用第三,第四个一维数组了,因为四个数组都是同一个数据演变看来的),将第五个一维数组中的每一个数字都加上(13997减1,再减第五个一维数组中最大的数)。(备注:这里用13997减1,再减第五个一维数组中最大的数,为的就是会由第五个一维数组产生13997,达到参照数字中有13000到13999之间的所有数字)。

这种算法在微机上是无法完成的。不知道有没有能在微机上得出结果的算法,请问各位高手指点,谢谢!!!

数组和参照数在下遍帖子里。
发表于 2008-7-17 10:25:02 | 显示全部楼层
问题太长了,没有耐心看下去的
请简明扼要地说明一下吧
发表于 2009-10-23 14:22:16 | 显示全部楼层
1# yxnk

看不下去··
发表于 2009-11-24 18:54:32 | 显示全部楼层
看不下去,太长了!
发表于 2010-6-8 14:40:03 | 显示全部楼层
利用计算机的运算速度,枚举法吧……
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2022-11-29 05:02 , Processed in 0.062351 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表