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

            Better man

            改變性格 改變命運!

             

            DFSID

             1 /*
             2 ID: hongfei5
             3 PROG: fence8 
             4 LANG: C++
             5 */
             6 /*
             7       dfsid(迭代加深搜索)
             8       適用于搜索樹又寬又深,但是可行解卻不是很深的題目
             9       廣度優先搜索可能會空間不夠
            10 */
            11 //按大小排序后,則切割的木料中必然包含rail[0]
            12 #include <iostream>
            13 #include <algorithm>
            14 using namespace std;
            15 int n,m;//木板和木料的數目
            16 int rail[1025];
            17 int board[51];
            18 int remain[51];
            19 int best;
            20 long sum;
            21 long long waste,maywaste,tot[1025];//表示已經不能再切的剩下的木料總和
            22 void dfs(int dep,int digit)
            23 {
            24       if(dep==0)
            25       {
            26             for(int i=digit;i<n;++i)
            27                   if(remain[i]>=rail[0])
            28                   {
            29                         printf("%d\n",best);
            30                         exit(0);
            31                   }
            32             return ;
            33       }
            34       for(int i=digit;i<n;++i)
            35             if(remain[i]>=rail[dep])
            36             {
            37                   long long oldwaste=waste;
            38                   remain[i]-=rail[dep];
            39                   if(remain[i]<rail[0]&&waste+remain[i]>maywaste)
            40                   {
            41                         remain[i]+=rail[dep];
            42                         continue;
            43                   }
            44                   if(remain[i]<rail[0])waste+=remain[i];
            45                   if(rail[dep-1]==rail[dep])dfs(dep-1,i);//如果rail[i]==rail[i-1],而第i塊木料在第K塊木板上切的,那么第i-1塊木料必定在大于等于K的木板上切出
            46                   else dfs(dep-1,0);
            47                   remain[i]+=rail[dep];
            48                   waste=oldwaste;
            49             }
            50 }
            51 int main()
            52 {
            53       freopen("fence8.in","r",stdin);
            54       freopen("fence8.out","w",stdout);
            55       scanf("%d",&n);
            56       for(int i=0;i<n;++i)
            57       {
            58             scanf("%d",&board[i]);
            59             remain[i]=board[i];
            60             sum+=board[i];
            61       }
            62       scanf("%d",&m);
            63       for(int i=0;i<m;++i)
            64             scanf("%d",&rail[i]);
            65       sort(board,board+n);
            66       sort(rail,rail+m);
            67       tot[0]=rail[0];
            68       int k=0;
            69       while(k<&& tot[k]<=sum){            //剪枝方法1 
            70             ++k;
            71             tot[k]=tot[k-1]+rail[k];
            72       }
            73       m=k;
            74       for(int i=m-1;i>=0;--i)
            75       {
            76             waste=0;
            77             maywaste=sum-tot[i];
            78             best=i+1;
            79             dfs(i,0);
            80       }
            81       printf("0\n");
            82       return 0;
            83 }
            迭代加深搜索 并不一定都要加深搜索深度 此題就是逐漸減少深
            1.很容易就能注意到,由于每塊rail的價值是相等的——也就是說切小的要比切大的來的劃算。那么我們在搜索能否切出i個rail的方案是自然要選最小的i個rail來切
            2.經過一些實驗可以發現,先切大的rail比先切小的rail更容易提前出解。同樣,[先切小的board比先切大的board更容易提前出解?]{注:好像先切大的board要比先切小的更快
            3.由于r最大可能是1023,但是rail長度的范圍卻只有0~128,這點提醒了我們有很多rail的長度會是相同的。所以我們要避免 冗余,優化搜索順序。若有rail[i+1]=rail[i],則rail[i+1]對應的board一定大于等于rail[i]對應的board。可以 通過這種方法剪掉很多冗余的枝條
            4.相應的,如果board[i]=board[i+1],那么從board[i]切下的最大的rail一定大于等于從board[i+1]切下的最大的rail
            5.對于切剩下的board(無法再切下rail),統計一下總和。如果大于 board長度總和-rail長度總和,一定無解,可以剪枝。


            posted on 2009-01-30 18:12 SHFACM 閱讀(776) 評論(0)  編輯 收藏 引用

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久99精品国产一区二区三区| 三级三级久久三级久久| 国产精品久久自在自线观看| 国产成人久久AV免费| 国产精品女同一区二区久久| 亚洲精品乱码久久久久久不卡| 奇米影视7777久久精品人人爽| 久久99精品久久久久久动态图 | 久久精品亚洲日本波多野结衣| 久久99精品久久久久久hb无码| 理论片午午伦夜理片久久| 伊人久久大香线蕉综合影院首页| 超级碰久久免费公开视频| 亚洲日韩中文无码久久| 久久久久18| 久久国产精品99精品国产987| 亚洲伊人久久综合中文成人网| 国产精品99精品久久免费| 久久精品国产亚洲αv忘忧草 | 国产精品九九久久免费视频 | 亚洲综合伊人久久综合| 久久久久亚洲精品男人的天堂| 精品久久久无码人妻中文字幕豆芽| 午夜精品久久久久9999高清| 99久久综合国产精品二区| 久久精品午夜一区二区福利 | 久久男人Av资源网站无码软件| 久久综合伊人77777| 国产精品午夜久久| 伊人久久综在合线亚洲2019| 国产精品久久久久aaaa| www性久久久com| 国产精品免费看久久久| 久久综合狠狠综合久久综合88| 伊人久久大香线蕉AV色婷婷色| 久久成人小视频| 久久久国产亚洲精品| 久久成人小视频| 久久SE精品一区二区| 久久国产劲爆AV内射—百度| 无码AV波多野结衣久久|