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

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

            在下面的代碼中,因?yàn)榇_定上下界都使用了浮點(diǎn)運(yùn)算,最終還是需要把當(dāng)前結(jié)果和目標(biāo)結(jié)果比較。
            浮點(diǎn)運(yùn)算~真讓人糾結(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 閱讀(2430) 評論(1)  編輯 收藏 引用 所屬分類: 題目分類:搜索

            FeedBack:
            # re: 經(jīng)典迭代加深搜索——埃及分?jǐn)?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;我對比了很多人的代碼,也都是這個問題,正確答案其實(shí)不是這個,不過我這里沒有那個正確答案,我先找找看有沒有,如果不麻煩的話你可以看一看,謝謝。  回復(fù)  更多評論
              
            国产日韩久久免费影院| 99久久99久久| 久久久久国产精品人妻| 三级三级久久三级久久| 欧洲成人午夜精品无码区久久| 久久99精品久久久久久久久久| 88久久精品无码一区二区毛片| 青青热久久国产久精品| 无码人妻久久一区二区三区免费| 99热精品久久只有精品| 人妻少妇久久中文字幕| 久久精品夜色噜噜亚洲A∨| 少妇无套内谢久久久久| 激情五月综合综合久久69| 久久久久亚洲精品无码蜜桃| 久久久久久久亚洲精品| 国产亚洲欧美成人久久片| 久久亚洲AV成人无码软件| 国产精品99久久不卡| 国产精品久久永久免费| 一本色道久久88—综合亚洲精品 | 国产人久久人人人人爽| 精品久久久一二三区| 久久99亚洲综合精品首页| 久久er国产精品免费观看2| 亚洲中文久久精品无码| 欧美激情一区二区久久久| 久久综合视频网站| 久久97久久97精品免视看| 国产99精品久久| 国产精品久久一区二区三区| 2021精品国产综合久久| 午夜精品久久久久久99热| 久久精品国产亚洲AV影院| 亚洲人成网站999久久久综合| 久久精品国产一区二区| 久久99国产精品成人欧美| 久久精品无码av| 久久综合久久综合亚洲| 久久亚洲AV无码精品色午夜| 国产精品美女久久福利网站|