• <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 閱讀(255) 評論(0)  編輯 收藏 引用 所屬分類: 搜索給我啟發題
            <2012年11月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品无码久久久久久尤物| 久久AV无码精品人妻糸列| 伊人丁香狠狠色综合久久| 久久99精品久久久久久水蜜桃| 午夜视频久久久久一区 | 国产69精品久久久久9999APGF | 久久亚洲国产成人影院| 亚洲AV日韩精品久久久久久久| 人人狠狠综合久久亚洲88| 久久久久se色偷偷亚洲精品av| 久久综合丁香激情久久| 性做久久久久久免费观看| 久久人人爽人人爽人人片av高请| 亚洲综合精品香蕉久久网97| 亚洲国产精品高清久久久| 久久露脸国产精品| 国产精品久久毛片完整版| 久久九九久精品国产免费直播| 精品久久人人爽天天玩人人妻| 久久久久九国产精品| 精品蜜臀久久久久99网站| 怡红院日本一道日本久久 | 久久久久久毛片免费看| 国产人久久人人人人爽| 久久久久久久波多野结衣高潮 | 国色天香久久久久久久小说| 久久久久国产| 99久久精品费精品国产| 国产精品99精品久久免费| 色诱久久久久综合网ywww| 久久受www免费人成_看片中文| 久久乐国产精品亚洲综合| 欧美激情精品久久久久久| 久久婷婷人人澡人人| 久久久久99精品成人片三人毛片 | 性高湖久久久久久久久AAAAA| 亚洲国产天堂久久综合网站| 久久国产精品99久久久久久老狼| 亚洲色婷婷综合久久| 亚洲AV成人无码久久精品老人 | 伊人久久大香线蕉AV色婷婷色|