まず、バックトラックの理解
バックトラックは、最適なソリューションの完全なアレイの等価から発見され、それだけではない、完全な配列トラバーサルソリューションスペースツリーの問題、深さ優先探索トラバーサルは、制約関数の中央から下のルートから始まります剪定やバウンディング機能を、横断の数を減らし、条件が満たされない場合、それは木の上の解空間の背中を横断する、または最適なソリューションの深さ優先探索をダウン継続するダウントラバース。
第二に、サブセット和問題
解空間は、ベクトルで表現される(1、1、1、0、0)であり、この数は、選択され、0が選択されていない表します。
制約関数:和+ S [T] <= C。tは、横断電流サブセットを合計する現在のノードであり、S [t]は、現在のノードの値です。
コードは以下の通りであります:
1つの#include <iostreamの> 2 使用して 名前空間STD; 3 の#define MAX 1000年 4。 5。 INT N-; // セットサイズ 6 のint C; // ターゲット 7 INTの S [MAX]; // セット 。8 int型 SUM = 0 ; / / 電流および 9。 int型 X [MAX] = { 0 }; // レコードのサブセット 10 INTフラグ=で0 ; //レコードかどうかを実行可能な解決策を見つけるために 11。 12が ボイド(バックトラックINT T){ 13は IF(==内のフラグ1。 )リターン ; // 検索溶液リターン 14 IF(T> N-){ 15 // 記録又は出力可能溶液 16 IF( !&& C == SUM 内のフラグ){ 17 、フラグ= 1 ; 18である ため(INT I = 1 I <= N; I ++ ) 19 IF(X [I] == 1 ) 20は COUT << S [I] << " " ; 21は COUT << ' \ N- ' ; 22が 戻り、 23である } 24 } 25 他{ 26は IF(SUM + S [T] <= C){ 27 X [T] = 1 ; 28 SUM = + S [T ]; 29 バックトラック(T + 1); // 左サブツリートラバース 30 SUMを- = S [T]; 31である X [T] = 0 ; 32 } 33のIS バックトラック(T + 1); // トラバース右サブツリー 34である } 35 } 36 37 [ INT メイン(){ 38である CIN >> N- C; 39 int型 A = 0 ; 40 用(INT I = 1 ; I <= N-; I ++ ){ 41は、 CIN >> S [I]、 42は A + = S [I]は、 43である } 44がなく IF(A <C) // すべての要素の集合とが目標値よりも小さい場合、確かに溶液 45 COUT << " ノーソリューション!\ N-" ; 46は、 他の{ 47 バックトラック(1 ;) 48 IF(=内のフラグ!1。 ) // ソリューションをバックトラックした後、まだ発見されない 49 COUT << " !ノーソリューション" << ' \ N- ' ; 50 } 51は、 システム(" PAUSE " ); 52である リターン 0 ; 53です }
プログラミングの問題では第三に、学習問題と力
私が最も珍しいが、選択機能と機能をバウンディング制約が、これらの二つは本当に少し困難な場合、これら2つの関数は、一度良い仕事をしませんでしたバックトラック学び、それが最終的な結果がエラーにつながる、アルゴリズムタイムアウトにつながると感じています。
私たちは、困難な問題が発生していなかったチームをプログラミング結び目、チームメイトの制約は常に非常に良い、プログラミングで私を助けて、この一方の機能が優れている理解します。