• <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 閱讀(2430) 評論(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ù)  更多評論
              
            三上悠亚久久精品| 开心久久婷婷综合中文字幕| 久久婷婷五月综合色高清| 欧美噜噜久久久XXX| 香港aa三级久久三级| 久久99精品国产麻豆宅宅| 色8久久人人97超碰香蕉987| 精品欧美一区二区三区久久久| 久久精品国产亚洲AV蜜臀色欲| 日本道色综合久久影院| 亚洲va久久久噜噜噜久久男同| 国产精久久一区二区三区| 青草国产精品久久久久久| 久久人人爽人爽人人爽av| 久久久久久毛片免费播放| 手机看片久久高清国产日韩| 热久久这里只有精品| 久久久久久久久无码精品亚洲日韩 | 亚洲va久久久噜噜噜久久男同| 国产精久久一区二区三区| 精品久久久久久中文字幕人妻最新| 亚洲国产一成久久精品国产成人综合 | 伊人色综合久久天天人守人婷| A狠狠久久蜜臀婷色中文网| 久久人人爽人人爽人人片AV麻烦 | 国产精品免费久久久久电影网| 久久国产精品无码HDAV| 日韩精品久久久肉伦网站 | 日产精品久久久一区二区| 亚洲精品tv久久久久久久久久| 国产午夜精品久久久久九九| 国产精品久久久久久影院| 国产精品99精品久久免费| 久久天天躁狠狠躁夜夜96流白浆| 色综合久久无码中文字幕| 亚洲精品乱码久久久久久按摩| 亚洲色大成网站www久久九 | 97久久超碰国产精品旧版| 国产人久久人人人人爽| 久久福利青草精品资源站| 国产精品成人99久久久久 |