• <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>
            posts - 195,  comments - 30,  trackbacks - 0

            錯誤代碼,過不了的數據14:15 10 17 16 12 1 10 20 17 19 4 5 9 5  可能解:(20 15 5 ),(19 17 4 ),( 17 12 10 1 ), ( 16 10 9 5 )
            下面的代碼“no”,因為(20 19 1),(17接下來湊不出來 )
            #include<iostream>
            #include<cstdlib>
            #include<algorithm>
            using namespace std;
             int length[21];
             int mark[21];
             bool cmp(int x,int y)
            {
                return x>y;
            }


              int  dfs(int sum,int flag,int n,int time)//´Ótime¿ªÊ¼ËÑË÷
              {
              if(sum==0)return 1;
                if(time<n)
              {
               for(int k=time;k<n;k++)
               {
                if(mark[k]<0&&sum-length[k]>=0)
                {
                 mark[k]=flag;
                 if(dfs(sum-length[k],flag,n,k+1))
                 return 1;
                 else
                 mark[k]=-1;
                   } 
               }
              }
                
             return 0;
              }
              int main()
              {
              freopen("s.txt","r",stdin);
              freopen("key.txt","w",stdout);
              int num,n;
             
              cin>>num;
              while(num--)
              {
              int sum=0;
              cin>>n;
              for(int k=0;k<n;k++)
              {
               cin>>length[k];
               mark[k]=-1;
               sum+=length[k];
              }
              sort(length,length+n,cmp);
              if(sum%4!=0||length[0]>sum/4)
              cout<<"no"<<endl;
              else
              {
               sum/=4;
               if(dfs(sum,1,n,0))
                {
               if(dfs(sum,2,n,0))
                      {
                 if(dfs(sum,3,n,0))
                 cout<<"yes"<<endl;
                 else
                 cout<<"no"<<endl;
                    } 
                    else
                    cout<<"no"<<endl;
                      }
                     else
                     cout<<"no"<<endl;
              }
                }
              //system("PAUSE");
              return   0;
              }
            正確的解法應當是,在一起搜索。
            下面是一段超時的代碼
            #include<iostream>
            #include<cstdlib>
            #include<algorithm>
            using namespace std;
             int length[21];
             int mark[21];
             int flag=0;
             int target;
             bool cmp(int x,int y)
            {
                return x>y;
            }

              int func(int i)
              {
              while(mark[i]>0)
              i++;
              return i;
             }
              void  dfs(int sum,int n,int time,int level)//從序號為time的開始搜索
              {
              if(flag)return ;
              if(sum==0&&level==3)
              {
              flag=1;
              return;
                 }
                 if(sum==0)
                 {
               level++;
               dfs(target,n,func(0),level);
              }
                else if(time<n)
              {
               for(int k=time;k<n;k++)
               {
                if(k>1)
                           {
                           
                            if(length[k]==length[k-1]&&!mark[k-1])
                                continue;//顯然
                           }
                            if(sum<length[n-1])  continue;//顯然
                if(mark[k]<0&&sum-length[k]>=0)
                {
                 mark[k]=1;
                 dfs(sum-length[k],n,func(k+1),level);
                 mark[k]=-1;
                   } 
               }
              }
              }
              int main()
              {
              freopen("s.txt","r",stdin);
              freopen("key.txt","w",stdout);
              int num,n;
             
              cin>>num;
              while(num--)
              {
              int sum=0;
              cin>>n;
              for(int k=0;k<n;k++)
              {
               cin>>length[k];
               mark[k]=-1;
               sum+=length[k];
              }
              sort(length,length+n,cmp);
              if(sum%4!=0||length[0]>sum/4)
              cout<<"no"<<endl;
              else
              {
               sum/=4;
               target=sum;
               dfs(sum,n,0,0);
                   if(flag==0)
                   cout<<"no"<<endl;
                   else
                   cout<<"yes"<<endl;
              }   
                }
              //system("PAUSE");
              return   0;
              }

            上面超時就超時原因是減枝不徹底。level標記也不太好
            決定另外爐灶,先看看別人的代碼
            #include<iostream>
            #include<algorithm>
            using namespace std;
            int s[21];
            int v[21];
            int len;
            int m;
            int dfs(int cur,int num,int beg,int fin)
            {    
             int solve(int );
             if(num==1)
              return 1;
             if(cur==len)
             {
              return solve(num-1);
             }
               for(int i=beg;i>=fin;i--)
               {
                if(!v[i]&&cur+s[i]<=len)
                {  
                 v[i]=1;
                 if(dfs(cur+s[i],num,i-1,fin))
                  return 1;
                 v[i]=0;
                }
               }
               return 0;
            }

            int solve(int edge_num)
            {   
                 int i;
              for(i=m;i>=1;i--)
               if(!v[i])
               { 
                v[i]=1;
                if(dfs( s[i],edge_num,i-1,1))
                 return 1;
                v[i]=0;
               }
             return 0;
            }

            int main()
            {
             int n;
             cin>>n;
             while(n--)
             {
              
              cin>>m;
              int i;
              int sum=0;
              for(i=1;i<=m;i++)
              {
               cin>>s[i];
               sum+=s[i];
               v[i]=0;
              }
              
              len=sum/4;
              if(4*len!=sum)
              {
               cout<<"no"<<endl;
               continue;
              }
              sort(s+1,s+m+1);
              if(s[m]>len)
              {
               cout<<"no"<<endl;
               continue;
              }
              if(solve(4))
               cout<<"yes"<<endl;
              else
               cout<<"no"<<endl;
             }
             return 0;
            }//剪枝還可以做得更好!!!
            人家的solve寫得好!!,結合dfs.

            posted on 2009-07-03 23:29 luis 閱讀(248) 評論(0)  編輯 收藏 引用 所屬分類: 搜索給我啟發題
            <2010年12月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲熟妇无码另类久久久| 亚洲狠狠久久综合一区77777| 99热成人精品热久久669| 亚洲国产美女精品久久久久∴| 日本精品久久久久影院日本| 国产日韩欧美久久| 色成年激情久久综合| 99久久综合狠狠综合久久| 91精品免费久久久久久久久| 国产激情久久久久影院| 国产精品久久久99| 日产久久强奸免费的看| 要久久爱在线免费观看| 久久无码AV中文出轨人妻| 色欲久久久天天天综合网精品| 久久久久女人精品毛片| 久久综合久久综合九色| 久久久久香蕉视频| 中文字幕人妻色偷偷久久| 亚洲AV无码久久精品色欲| 欧美久久综合性欧美| 久久99这里只有精品国产| 久久精品国产亚洲av水果派| 久久99久久成人免费播放| 日本WV一本一道久久香蕉| 99久久免费国产特黄| 久久影视综合亚洲| 久久婷婷五月综合色高清| 9191精品国产免费久久| 思思久久精品在热线热| 亚洲狠狠综合久久| 中文字幕乱码人妻无码久久 | 久久av无码专区亚洲av桃花岛| 精品精品国产自在久久高清| 日日狠狠久久偷偷色综合免费| 久久久精品国产sm调教网站| 精品久久久久久国产免费了| 久久久久久午夜成人影院 | 国产日韩久久免费影院| 久久强奷乱码老熟女网站| 久久99精品久久久久久野外|