説明タイトル:2つのグループの数と二つのグループ間の差を最小限に抑えながら、(1未満)できるだけ等しい数のグループに分割数nの配列、のために。
真とし、図1の番号i、及びすべての可能なを見つけ、これらのフラグから選択される数k:類似0-1ナップザック問題、アイデアを用いて被写体。(K、iは、フラグコードを参照のこと)
1 公共 静的 ボイドメイン(文字列[]引数){ 2 INT [] ARR = {1、2、3、5、7、8、9 }。 3 INT N = 7 。 4 int型の和= 0 。 5 ため(int型のI:ARR){ 6 和+ = I。 7 } 8 ブール [] []フラグ= 新しい ブール値 [N / 2 + 1] [和/ 2 + 1 ]。 9 のために(int型、iがn / 2 + 1 <; I = 0 iが++ ){ 10 のために(INTJ = 0; J <和/ 2 + 1、J ++ ){ 11 フラグ[i] [j]は= 偽。 12 } 13 } 14 フラグ[0] [0] = 真。 15 のための(int型 <; N ++ kはK、K = 0 {) 16 のための(int型:I = K・K; I> = 1 i-- N / 2 N / 2>を{) 17の // 遍历S(K 、I) 18 のための(INT J = 0であり、j <=和/ 2; J ++ ){ 19 であれば(j> = ARR [K] &&フラグ[I-1] [J- ARR [K]){ 20 フラグ[ i]の[j]は= 真; 21 } 22 } 23 } 24 } 25 のための(int型 I =和/ 2; I> = 0; iが++ ){ 26の 場合(フラグ[N / 2 ] [I]){ 27 のSystem.out.println(I)。 28 ブレーク; 29 } 30 } 31 }
(すなわち真がある)は、i-1、その様々な数と可能な症状から代わっKを取る:私は場所は[I-1]この行の意味は何フラグを理解することはより困難であると思います
最内層手段を循環している:私にARR [k]を追加し構成するの数をラインから様々なI-1を取り、内部[I]内のフラグで具現化。
第二層の循環手段:1-iは、多くの行を実行します
最も外側の層は、加数がそれを埋めるために続けています。
私は、いくつかの例をテストした不作為があるかもしれない、メッセージでも議論できるかを理解することは困難である、と指摘してメッセージを残してください。