其他部落格裡的零散的幾篇。統一放在這裡吧。
題目:
A fracion a/b(a < b) can be expressed in the way 1/b1 + 1/b2 + ... + 1/bn. Now can you achieve it and make the sum of b1 to bn minimum?
Input and Output
For each case there are tow positive intergers a and b( 0 < a < b <= 100), output the minimum sum.
Sample Input
2 3
3 4
4 15
Sample Output
6
6
16
Hint: 2/3 = 1/3 + 1/3, 4/15 = 1/6 + 1/10
思路:
一開始想它可能有數學結論,但是沒找到,於是就想直接搜尋。對於給定的a和b,a*b是一個顯然的解。可以使用這個解來進行搜尋深度的控制。但是盲目搜尋試著搜尋了一下99/100,等了半天沒有結果。肯定會逾時。
發現因為a/b是真分數,有a/b<1,於是有a/b – 1/2 < 1/2,再進一步,a/b – 1/2 – 1/3 < 1/6,可行的分母已經從3到6了,a/b – 1/2 – 1/3 – 1/7 < 1/42,可行的分母一下子變成了42,它的下一個可行的分母的最小值是前兩個相鄰分母的乘積,增長得非常快。於是想可以利用這一點來進行最佳化。
另外一點,對於一個真分數a/b,例如3/100,那麼像1/2,1/3這些值一開始就不應該被考慮,因為它們一開始就比3/100大了。也就是說,一開始的分母k不可能任意小,否則1/k比目標還大,k有個最小值,即1/k有個最大值:1/k <= ceil(a/b)=>k>=ceil(a/b),另外,由此也可以算出來,假如當前分數為c/d,當前選擇了k作為擴充的分母,那麼選擇k以後下一個最小的可行分母的值就是ceil( (d*k) / (c*k-d)),假設在選擇k的時候已經得到的和是s,那麼假如s+k+ceil((d*k)/(c*k-d))不小於當前答案,就可以剪掉這棵子樹,可以多算這一步來減小遞迴壓棧的代價。
假設當前的分數為a/b,那麼搜尋時最大可行的分母應該不超過b,否則得到的解不會是最優解。
有了這些最佳化就可以AC了,但是排名很靠後。