Poj площадь взять две кисти * ДФС обрезки очень важный вопрос

Основная идея:

Рухнул, есть две основные проблемы:

1. существует проблема обрезка, обрезка не будет тайм-аута;

 

2.DFS формулировка вопроса, я чувствую, как OJ, в частности, возвращая истинное ложным, к мульти-цикла рекурсивных решить все проблемы;

 

BOOL ДФС (Int N, Int индекса, значение INT, INT NUM) { 
    если (число == 3) 
        возвращает истину; 
    для (INT I = индекс; я <п, я ++) { 
        если {(визави [я]!) по 
            отношению [я] = истина; 
            если (VEC [I] + значение == CNT) { 
                если (ДФС (п, 0, 0, Num + 1)) 
                    возвращает истину; 
            } 
            Иначе , если (VEC [I] + значение <CNT) { 
                если (ДФС (п, + 1, VEC [I] + значение, Num)) 
                    возвращает истину; 
            } 
            Отношению [I] = FALSE; 
        } 
    } 
    Вернуться ложным; 
}

 В приведенном выше коде, например, путем ввода рекурсивные Все полученные результаты;

Прежде всего рода, с большим, чтобы гарантировать, что выборы, так как очень мало выборов не происходит, когда большое покрытие не может быть приспособлено, на этот раз сам не мог видеть вне;

В целом, рассчитывается по три итерации, каждая итерация быть найдена рекурсивно траверс условие выполняется;

В то время он застрял в том, чтобы связать эти три итерации, используя свой собственный цикл для петли три раза, или тайм-аут;

 

Большой брат код, когда первый через удовлетворенных непосредственно установить в новый слой рекурсивной итерации, и так как по отношению массива не изменяется, то можно увидеть снова продолжить поиск предыдущей базы;

 

 Во-вторых, количество итераций для контроля Num, Num = 3, когда время начала на прямой возвращения истинного;

Последующее общее может быть определена правильно ли реакция на первый слой с обратной, поэтому он будет знать, найти ли успешным. DFS может рассматриваться как обновленная версия первого, нам нужна стратификация;

 

Ключевые моменты:

Обрезка проблемы;

 

#include <iostream> 
#include <вектор> 
#include < строка > 
#include <алгоритм>
 с помощью  пространства имен STD; 

Const  INT maxn = 22 ;
BOOL отношению [maxn]; 
вектор < INT > VEC;
INT НКТ; // 边长

недействительным инициализации ( INT п) { 
    заливка (Vis, Vis + п, ложно ); 
    vec.resize (п); 
    // Правильные = 0; 
    CNT = 0 ; 
} 

BOOL CMP (Int а, ИНТ б) {
     вернуть а> Ь; 
} 

BOOL ДФС ( INT п, INT индекс, INT значение, INT NUM) {
     если (число == 3 )
         возвращают  верно ;
    для ( междунар я = индекс; я <п, я ++ ) {
         если (! {визави [я]) по 
            отношению [я] = истинный ;
            если (VEC [I] + значение == CNT) {
                 если (ДФС (п, 0 ,0 , Num + 1 ))
                     возвращают  верно ; 
            } 
            Иначе ,  если (VEC [I] + значение < CNT) {
                 если (ДФС (п, г + 1 , VEC [I] + значение, Num))
                     возвращают  верно ; 
            } 
            Отношению [I] = ложь ; 
        } 
    } 
    Вернуться  ложным ; 
} 

Int основной () {
     Int п; 
    CIN >> п;
    для ( INT I = 0; <п; я ++ ) {
         INT м; 
        CIN >> м; 
        INIT (м); 
        для ( Int I = 0 , я <м; я ++ ) { 
            CIN >> VEC [I]; 
            CNT + = VEC [I]; 
        } 
        Не если (CNT% 4 =! 0 ) { 
            соиЬ << " нет " << епсИ;
            продолжить ; 
        } 
        CNT / = 4 ;
        сортировать (vec.begin (), vec.end (), CMP); 
        если (VEC [ 0 ]> CNT) { 
            соиЬ << " нет " << End L , ;
            продолжить ; 
        } 
        // ДФС (п, 0, VEC [0]); 
        если (ДФС (м, 0 , 0 , 0 )) 
            соиЬ << " да " << епсИ;
        чего еще 
            соиЬ << « нет » << епсИ; 
    } 
    Возвращает  0 ; 
}

 

рекомендация

отwww.cnblogs.com/songlinxuan/p/12446189.html