第平行作業機が完了したタスクk(k <= 20)であると仮定し、N(N <= 20)。私は、TIのタスクを完了するための時間を必要としています。N I = 1〜、私TIのために必要な任意の整数nとk、およびタスク完了時間にアルゴリズムを設計するようにしてください。この計算は、最適なスケジュールのnタスクなので、すべてのタスクを完了するための最も早い時間に行われます。
入力フォーマット:
入力データの最初の行は2つの正の整数nとkを有しています。nは正の整数タスクを完了するのに要する時間をn個の第2行。
出力フォーマット:
初めての画面に計算された出力のすべてのタスクを完了します。
サンプル入力:
ここでは、入力のセットを与えられています。例えば:
7 3
2 14 4 16 6 5 3
出力例:
出力に対応し、ここで考えます。例えば:
17
タイトルはまた、バックトラックのすべての可能な例を列挙最初から始め、その後、剪定使用しています:
package 宿題;
import java.io.*;
クラス{公共PTAOptimalScheduling
//直接最大値maxをとる初期化;静的int型の最大値= Integer.MAX_VALUEの
静的INT N-;
K INT静的;
パブリック静的な無効メイン(文字列引数は、[])にIOException {スロー
StreamTokenizer新しい新しい=でStreamTokenizer(新しい新しいBufferedReaderのを)(新しい新しい(System.in)にInputStreamReader);
in.nextToken();
N- =(INT)in.nval;
in.nextToken();
K =(INT)in.nvalは、
INT A [] =新しい新しいINT [N- ]; //ストアセッション時に使用される、
INT B []は、新しい新しいINT [k]を=。マシンを作成する// K;
のための(INT I = 0、I <N - 、I ++){
in.nextToken()。
A [I] =(INT)in.nval;
}
カウント(A、B、0);
のSystem.out.println(MAX); //出力最終値;
}
静的ボイド数プライベート(INT []、int型B []、int配列){
IF(N - ==アレイ){//再帰丸い端、比較結果、
IF(MAX(B)<MAX)
最大= MAX( B);
}そうIF(MAX(B)<MAX){
(INTのためにI = 0、I <K; I ++){// K枝下方解決に、
B [I] = A + [配列];
カウント(A、B、+配列1);
B [I]は- = [配列]; // B []の値を復元し、それが他の枝に干渉しない;
}
}
}
プライベート最大静的整数(INT Aを[]){//比較リターン最大値;
INT最大= A [0];
のための(INT I = 0、I <K; I ++)
!IF(A [I]> maxの&& A [I] = 0)
最大= A [I]は、
最大値を返します;
}
}
アルゴリズムの時間計算量はO(N ^ K2)です。