--- ---復元コンテンツ始まります
基づい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(0、0、1 )。 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アレイを加え 、] 方向が順方向であることを確認します。失われたバックにわたって加え合計を覚えておいてください。