• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0

            給出一個分數,比如19/45,把它寫成若干個形如1/Ri的分數的和的形式,比如19/45=1/5+1/6+1/18,要求分母不能重復使用并且使用的分數的個數最少。(如果有多組個數相同的解,最后的分數的分母越小越好,這對于題目來說是次要的。)
            1、分母從小到大搜索
            為了避免重復搜索
            2、使用迭代加深搜索
            求“步驟數最少”這類問題,基本上有兩種似乎:廣搜、迭代加深搜索。對于這道題來說,如果廣搜將永遠得不到結果,分母可以無限大!但是迭代加深搜索就比較好,雖然做了許多重復工作,但狀態空間至少被限制住了。如果當前正在枚舉的分母,使得接下來的選擇即使每次都選擇最大,達到最大深度的時候也不可能達到目標分數,那么當前正在枚舉的分母及比它還大的分母,都不需要枚舉了。這樣可以給分母確定一個上界。另外,已經得到的結果加上當前枚舉的分母對應的分數,要小于等于目標分數,這樣給分母確定了一個下界(可以在O(1)的復雜度內確定這個下界)。

            在下面的代碼中,因為確定上下界都使用了浮點運算,最終還是需要把當前結果和目標結果比較。
            浮點運算~真讓人糾結的東西!

            以下是我的代碼:
            #include<algorithm>
            #include
            <cstdio>
            #include
            <cmath>
            using namespace std;

            int gcd(int a,int b)
            {
                
            for(int t=a%b;t;a=b,b=t,t=a%b); return b;
            }
            struct Type
            {
                Type():a_(
            0),b_(1) {}
                Type(
            int a,int b):a_(a),b_(b) {}

                
            int a_,b_;
            };
            Type 
            operator+(const Type &a,const Type &b)
            {
                Type re(a.a_
            *b.b_+a.b_*b.a_,a.b_*b.b_);
                
            int t(gcd(re.a_,re.b_));
                re.a_
            /=t;
                re.b_
            /=t;
                
            return re;
            }
            bool operator==(const Type &a,const Type &b)
            {
                
            return (a.a_*b.b_==b.a_*a.b_);
            }

            Type target;
            int ans,r[10000],t[10000];
            bool found;

            void dfs(const int &depth,const int &last,const Type &now)
            {
                
            if(depth>ans)
                {
                    
            if(now==target)
                    {
                        
            if(found)
                        {
                            
            bool cover(false);
                            
            for(int i=ans;i>=1;i--)
                                
            if(r[i]>t[i])
                                {
                                    cover
            =true;
                                    
            break;
                                }
                                
            else if(r[i]<t[i])
                                    
            break;
                            
            if(cover)
                                
            for(int i=1;i<=ans;i++)
                                    r[i]
            =t[i];
                        }
                        
            else
                        {
                            
            for(int i=1;i<=ans;i++)
                                r[i]
            =t[i];
                            found
            =true;
                        }
                    }
                    
            return;
                }
                
            for(int i=max(last+1,(int)ceil((double)(target.b_*now.b_)/(target.a_*now.b_-target.b_*now.a_))); ;i++)
                {
                    Type news(now
            +Type(1,i));
                    
            if(depth+(int)ceil((double)(target.a_*news.b_-target.b_*news.a_)*(i+1)/(target.b_*news.b_))>ans)
                        
            break;
                    t[depth]
            =i;
                    dfs(depth
            +1,i,news);
                }
            }

            int main()
            {
                freopen(
            "data.in","r",stdin);
                freopen(
            "data.out","w",stdout);

                
            while(scanf("%d%d",&target.a_,&target.b_)==2)
                {
                    found
            =false;
                    
            for(ans=1; ;ans++)
                    {
                        dfs(
            1,0,Type());
                        
            if(found)
                            
            break;
                    }

                    
            for(int i=1;i<=ans;i++)
                    {
                        
            if(i!=1)
                            printf(
            " ");
                        printf(
            "%d",r[i]);
                    }
                    printf(
            "\n");
                }

                
            return 0;
            }
            posted on 2011-05-09 22:59 lee1r 閱讀(2430) 評論(1)  編輯 收藏 引用 所屬分類: 題目分類:搜索

            FeedBack:
            # re: 經典迭代加深搜索——埃及分數
            2014-06-09 17:57 | lyd
            剛剛看了看你的這個問題的代碼,發現有個問題,但是在我的代碼中也有相同的問題,無法解決希望我們可以探討一下,有興趣可以訪問我的網易博客:http://lydws.blog.163.com/。就是有一組數據:3 997;這組數據我們的答案都是:354 5982 58823;我對比了很多人的代碼,也都是這個問題,正確答案其實不是這個,不過我這里沒有那個正確答案,我先找找看有沒有,如果不麻煩的話你可以看一看,謝謝。  回復  更多評論
              
            狠狠色丁香久久婷婷综合蜜芽五月 | 久久久久无码国产精品不卡| 久久精品国产亚洲77777| www.久久热| 久久综合九色综合欧美就去吻| 亚洲精品国产第一综合99久久| 天天爽天天狠久久久综合麻豆| 久久99国产精品尤物| 无码国内精品久久人妻麻豆按摩| 亚洲av成人无码久久精品| 91精品日韩人妻无码久久不卡| 色青青草原桃花久久综合| 精品久久久久久成人AV| 久久久久成人精品无码| 久久久久亚洲AV片无码下载蜜桃| 国内精品久久九九国产精品| 欧美久久久久久精选9999| 无码国内精品久久人妻| 无夜精品久久久久久| 久久精品亚洲精品国产欧美| 久久精品99久久香蕉国产色戒 | 人妻精品久久久久中文字幕一冢本| 久久精品国产精品亚洲精品| 中文字幕久久精品无码| 午夜精品久久影院蜜桃| 久久精品国产亚洲7777| 99久久综合狠狠综合久久| 国产91色综合久久免费| 久久棈精品久久久久久噜噜| 噜噜噜色噜噜噜久久| 99久久国产亚洲综合精品| 久久福利片| 久久综合色之久久综合| 久久亚洲中文字幕精品一区| 精品99久久aaa一级毛片| 久久本道久久综合伊人| 久久婷婷色综合一区二区| 性做久久久久久免费观看| 中文字幕精品无码久久久久久3D日动漫| 狠狠色综合网站久久久久久久 | 国内精品欧美久久精品|