• <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;我對比了很多人的代碼,也都是這個問題,正確答案其實不是這個,不過我這里沒有那個正確答案,我先找找看有沒有,如果不麻煩的話你可以看一看,謝謝。  回復  更多評論
              
            一级做a爰片久久毛片免费陪| 99久久国语露脸精品国产| 伊人久久大香线蕉亚洲五月天| 国产免费久久精品99re丫y| 7777精品伊人久久久大香线蕉| 青青草原精品99久久精品66 | 久久亚洲高清综合| 欧美亚洲国产精品久久| 高清免费久久午夜精品| 情人伊人久久综合亚洲| 亚洲国产成人久久综合一区77| 漂亮人妻被黑人久久精品| 久久AAAA片一区二区| 国内精品久久久久影院优| 少妇被又大又粗又爽毛片久久黑人| 久久综合给合久久狠狠狠97色69| 99久久精品国产综合一区| 久久久久久久人妻无码中文字幕爆 | 亚洲精品99久久久久中文字幕| 久久久久无码精品国产不卡| 欧美久久天天综合香蕉伊| 丁香狠狠色婷婷久久综合| 久久精品国产亚洲αv忘忧草| 中文字幕一区二区三区久久网站| 亚洲人成伊人成综合网久久久| 国产日韩久久免费影院| 久久免费精品一区二区| 亚洲精品美女久久久久99| 精品久久久一二三区| 人妻精品久久久久中文字幕| 国产伊人久久| 狠狠综合久久综合中文88| 久久精品视频网| 狠狠狠色丁香婷婷综合久久五月| 一本一道久久综合狠狠老| 久久妇女高潮几次MBA| 超级97碰碰碰碰久久久久最新| 日韩精品无码久久一区二区三| 国产精品免费看久久久香蕉| 国产精品免费久久久久久久久 | 久久狠狠高潮亚洲精品|