这道题使用穷举,由于最多只有15种饲料,2^15 = 不算大,在我的程序中使用了Gray码来增加速度,下面介绍一下
Gray是一种二进制编码,如下是一个0至7的Gray码,共8个
000
001
011
010
110
111
101
100
Gray的特点就在于每两个相邻的编码只有一位不同,从这一点可以联想到如果我们使用Gray码来表示哪些饲料被使用(1表示使用,0表示不用),那么每一次枚举时仅需改变一种饲料的使用状态,例如上面的Gray码表示有3种饲料时,先考虑000(三种饲料都不用),然后考虑001(仅使用第0种饲料)
我们把所有使用的饲料的含量总和放在一组数据中,每次枚举时仅需增加或者减少一种饲料的含量,因此提高了速度
此时可以发现我们关心的并不是Gray码本身,而是某次枚举是改变了哪一种饲料的使用状态,即第i个Gray码与第i+1个Gray码中哪一位不同,我使用了grayChange[i]来记录第i个Gray码与第i+1个Gray码中不同的位置。
最后说说如何得到grayChange[]数组(这个类似于“汉诺塔”游戏)
2位Gray码的grayChange[] 为 1、2、1,记为s(2),下同
而n位的为:s(n) = s(n-1) + n + s(n-1),
如:
s(3) = 1、2、1、3、1、2、1
s(4) = 1、2、1、3、1、2、1、4、1、2、1、3、1、2、1

 

 

Code
posted on 2008-12-02 17:21  刘永辉  阅读(320)  评论(0)    收藏  举报