DFS二度目の再学習

--- ---復元コンテンツ始まります

    基づい1.まず、完全な配列

    

書式#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstdを、
const  int型 MAXN = 1E3;
int型VIS [MAXN]。
int型のp [MAXN]。
int型のn;
int型、T = 0 ;
ボイド DFS(int型X)
{ 
    場合(X == N + 1 
    { 
        ためINT iは= 1 ; I <= N; I ++ 
            COUT << P [I] << "  " 
            coutの << てendl;
            リターン;
    } 
    ためINT iは= 1 ; I <= N; I ++ 
    { 
        場合(!VIS [I])
        { 
            VIS [I] = 1 
            P [X] = I。
            DFS(X + 1 )。
            VIS [I] = 0 ; 
        } 
    } 
} 
int型のmain()
{ 
    一方(CIN >> N)
    { 
        memsetの(VIS、0はsizeof (VIS))。
        DFS(1 )。
    }
}

    2.  HDU2614 

      これは、ゴーストの問題は、まだかなりの問題、また誤解を招くヒント部分の意味を理解していないものです。とにかく、問題解決には、問題解決の数を見上げ、時間が長くなる作るしようとすることです。Tijをするために、資格、VIS [j]のすべてが再利用できない場合。しかし、コードは非常に単純な、基本的なテンプレートのDFS操作です。

      

書式#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstdを、
const  int型 MAXN = 20 ;
int型のE [MAXN] [MAXN]。
int型 VIS [MAXN * MAXN]。
int型ANS;
整数K、N。
ボイド DFS(INT今、INTの時間、int型k)は
、{ 
    ためINT iは= 0、I <N; I ++ 
    { 
        場合(VIS [I] && E [今] [I]!> = 時間)
        { 
            VIS [I] = 1 ;
            DFS(I、E [今] [i]は、K + 1 )。
            VIS [I] = 0 ; 
        } 
    } 
    ANS = MAX(ANS、K)。
} 
int型のmain()
{ 
    一方(CIN >> N)
    { 
        ためintは iが= 0を I ++; I <N のためのint型 J = 0 ; J <N; J ++ 
                CIN >> E [I] [J] ; 
        memsetの(VIS、0はsizeof (VIS))。
        VIS [ 0] = 1 
        ANS = 1 
        DFS(001 )。
        coutの << ANS << てendl; 
    } 
}

 

5974:[エントリー]再帰決意組成物の素数+

    

タイトル説明

既知のnは整数B1、B2、...、BN

整数K(K <N)。

必要に応じてそれぞれ使用可能の範囲でnは整数の整数kを加えます。

例えば、N = 4、K = 3,4の整数で、それぞれ、利用可能な3,7,12,19、それらのすべての組み合わせであるときである:
    3 + 7 + 12 = 223 + 7 + 19 = 297 + 12 + 19 = 383 + 12 + 19 = 34。
  今、私たちは種の合計数を計算するように依頼し、素数です。

+ 7 3 + 19 = 29:たとえば、実施形態は、一つだけ、そして素数です。

 

エントリー

最初の二つの整数の行:N、K(1 <=  N <= 20、K <n)の
2行目のnは整数:X1、X2、...、XN  (1 <= XI <= 5000000)

輸出

整数(プログラムの条件を満足する数値)。 

サンプル入力

4 3
書式#include <iostreamの> 
の#include <CStringの> 
の#include <cstdioを>
 使用して 名前空間をSTD。
const  int型 MAXN = 200 ;
int型VIS [MAXN]。
int型[MAXN]。
int型NUM [MAXN]。
整数N、K。
int型 ANS = 0 ;
int型の合計= 0 ;
INT AC(INT X)
{ 
    場合(X <= 1 戻り 0 ;
    INT iは= 2 I ++; iは<= X * 
    { 
        場合(X%I == 0 戻り 0 ; 
    } 
    を返す 1 
} 
ボイド DFS(int型IND)
{ 
    場合(IND == K + 1 
    { 
        場合(AC(合計))
            ANS ++ / *     のための(I 1 = INT; I <= K; I ++)     
            COUT << NUMを[I] <<」「。* / 
            coutの << てendl;
        リターン; 
    } 
    ためINT iが= 1 ; I <= N; I ++ 
    { 
        場合(VIS [I] && I> NUM [IND-!1 ])
        { 
            合計 + = [I]。
            NUM [IND] = I。
            VIS [I] = 1 
            DFS(IND + 1 )。
            VIS [I] = 0 ;  - = [I]。
        } 
    } 
} 
int型のmain()
{ 
    CIN >> N >> K。
    以下のためにINT iが= 1 ; I <= N I ++ 
    { 
        CINを>> [i]は、
        NUM [I] = I。
    } 
    DFS(1 )。
    coutの << ANS << てendl;
    リターン 0 ; 
}

 


3 7 12 19

サンプル出力

1 
    
  DFSエントリのタイトル
  を初めてTについては、ので、ダブルカウントと非効率的なのがあるでしょう。したがって、問題の解決策を参照して、インデックス、I> NUM [IND-1を記録するために、NUMアレイを加え 、] 方向が順方向であることを確認します。失われたバックにわたって加え合計を覚えておいてください。
  
  

おすすめ

転載: www.cnblogs.com/liyexin/p/11668398.html