Основная идея:
Рухнул, есть две основные проблемы:
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 ; }