POJ 1011(DFS +プルーン)

POJ 1011

タイトルは50を超えていない、あなたのn数を意味します。あなたはm個のnグループ、同じ長さlenの各グループに入れましょう、そのような最短LENこと

多くの側面にDFS、剪定ばさみを書くためのライトタイムアウト

1:降順を堅持するために最適化された検索順序、長いポールをしようとする優先権

2:冗長の等価物を排除します

  1.、その後、確かに失敗した検索が失敗したときに失敗すると、次の数は数に等しいです

  すぐにバックトラック2.現在のスティックに固執再帰的なブランチを綴るする最初の試みが失敗した場合は、直流分岐判断が失敗し、

  3.制限が参加しました

書式#include <iostreamの> 
の#include <cmath> 
の#include <cstdioを> 
する#include <CStringの> 
の#include < 文字列 > 
の#include <マップ> 
書式#include <iomanip> 
書式#include <アルゴリズム> 
書式#include <キュー> 
の#include <スタック> 
#include < セット > 
の#include <ベクトル>
 // CONST int型MAXN = 1E5 + 5。
#defineは長い長いっ
{(-1,11,11- b)はLLのGCDをリターン?B GCD(B、%の; B)} 
(-1,11,11- b)は{LLのLCM 戻り、(/ GCDを

#define MAX INT_MAXの
 に#define(I、a、b)は(;;私は= Bの<++ I私は= INT)のためFOR
 の#defineバグはcout << "------------- - "<< ENDL
 使用して 名前空間はstdを、
ブール CMP(INT A、INT B)
{ 
    戻り > Bと、
} 
int型のCNT、和、MAXX、LEN、N。
int型 VIS [ 500 ]、[ 500 ]。

int型 DFS(int型のk、int型のタクシー、INT最後)// 最後排除等效冗余3 
{
     場合(K> CNT)
    { 
        リターン ; 
    } 
    であれば(CAB == LEN)
    { 
        戻り DFS(K + 101 )。
    } 
    int型 =失敗0//          排除等效冗余1 
    のためのint型、iが<= N; iは最後= I ++)    // 最後排除等效冗余3 
    {
         場合(VIS [I] == 0 &&キャブ+ [I] <= LEN &&失敗=![I])
        { 
            VIS [I] = 1 もし(DFS(K、キャブ+ [i]は、I + 1 ))
                 リターン trueに
            失敗 = A [I]; 
            VIS [I] = 0 ;
             IF(キャブ== 0 ||キャブ+ [I] == LEN)// キャブは0、または合計は正確でlenが、失敗した場合、それは失敗しなければならない。@ 当量を冗長2除く
                リターン falseに; 
        } 
    } 
    戻り falseに; 
} 
int型のmain()
{ 
    (IOSの:: sync_with_stdio はfalse );
 //     freopenは(「D:\\ \\ common_textを\\ in.txt code_stream "" R&LT "を、STDIN);
 //     freopenは(" D:\\ \\ code_stream common_text out.txtを\\ "" W」、STDOUT); 
    一方(CIN >> N && N)
    { 
        int型のx = 0、HHH = 0 
        memsetの(VIS、0はsizeof (VIS))。
        合計 = 0 ; 
        MAXX = 0 ; 
        CNT = 0 、lenの; 

        FOR(I、1 、N)
        { 
            CIN >> X;
            もし(x <= 50 
            { 
                HHH ++ 
            } 
            [HHH] =のX。 + = X。
            MAXX = MAX(MAXX、X)。
        } 
        N = HHH。



        ソート( + 1、A + 1 + N、CMP)。
        INT ; iは<=和; I = MAXX iは++)   // changdu 
        {
             場合(和%I == 0 
            { 
                // COUT << I << " "<< CNT <<"" << ENDL。
                LEN = I; 
                CNT =合計/ I; 
                 memsetの(VIS、0はsizeof(VIS))。
                もし(DFS(101)== 1 ブレーク
            } 
        } 

        COUT << LEN << ENDL。
    } 


}

 

オリジナルスティックの根の長さが減少している(x、yの最初の添加をy、xの最初の添加後に添加された後に添加のみを検索する必要があり、等価です)

おすすめ

転載: www.cnblogs.com/jrfr/p/11272129.html