• <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

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

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

            以下是我的代碼:
            #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 閱讀(2446) 評論(1)  編輯 收藏 引用 所屬分類: 題目分類:搜索

            FeedBack:
            # re: 經(jīng)典迭代加深搜索——埃及分數(shù)
            2014-06-09 17:57 | lyd
            剛剛看了看你的這個問題的代碼,發(fā)現(xiàn)有個問題,但是在我的代碼中也有相同的問題,無法解決希望我們可以探討一下,有興趣可以訪問我的網(wǎng)易博客:http://lydws.blog.163.com/。就是有一組數(shù)據(jù):3 997;這組數(shù)據(jù)我們的答案都是:354 5982 58823;我對比了很多人的代碼,也都是這個問題,正確答案其實不是這個,不過我這里沒有那個正確答案,我先找找看有沒有,如果不麻煩的話你可以看一看,謝謝。  回復(fù)  更多評論
              
            99久久成人国产精品免费| 精品久久久久久无码中文字幕一区 | 久久有码中文字幕| 性欧美丰满熟妇XXXX性久久久| 久久精品中文字幕无码绿巨人| 久久国产精品免费一区二区三区| 久久久国产视频| 久久免费线看线看| 久久久久se色偷偷亚洲精品av| 99久久99久久| 久久亚洲精品无码VA大香大香| 亚洲国产成人久久精品影视| 狼狼综合久久久久综合网| 免费一级欧美大片久久网| 国产成人久久精品一区二区三区| 一本伊大人香蕉久久网手机| 久久久久国产视频电影| 久久99精品久久久久子伦| 久久婷婷色综合一区二区| 72种姿势欧美久久久久大黄蕉| 香蕉99久久国产综合精品宅男自| 亚洲国产天堂久久久久久| 久久免费国产精品| 99久久无色码中文字幕| 人人妻久久人人澡人人爽人人精品| 99久久精品国产一区二区三区 | 久久久免费精品re6| 一本综合久久国产二区| 精品久久国产一区二区三区香蕉 | 国产福利电影一区二区三区久久久久成人精品综合 | 久久精品www人人爽人人| 久久精品综合网| 人妻无码精品久久亚瑟影视| 久久激情亚洲精品无码?V| 久久线看观看精品香蕉国产| 狠狠色丁香婷婷久久综合不卡| 浪潮AV色综合久久天堂| 久久久免费精品re6| 精品精品国产自在久久高清| 国产精品久久久久无码av| 国产国产成人精品久久|