最近、この問題を見ることが起こりました。
二つの配列、bがあり、任意の値の大きさは、整数N、配列要素、順不同です。
最小の差を交換することにより、素子のB、[元素及び配列]および[Bと配列要素】よううち:要件
いくつかの審議の後、私は、問題と、次のことを考えを解決するためにブルートフォースメソッドを使用しようとしました:
図1に示すように、それぞれ、A、B、および配列sum_aの要素、sum_b検索
2を算出分= ABS(sum_a - sum_b)
図3は、トラバースのn×n個:交換、bは任意の要素であり、各交換は、二次元配列Tの要素として、(A)-sum(B)の絶対値和を算出した交換後。
前記和(A)-sum(B) = sum_a - [I] + B [J] - (sum_b + [I] -b [J])= sum_a -sum_b + 2 *(B [J] -a [I])
4、他のmin_tの=さt [0] [0 ]、 次にT-シーケンスを反復:新しい値min_tとしてTを持つ要素、要素のmin_t> Tの場合は
5分及びmin_tの大きさを決定する:min_tは分<場合は、その後、Bはスイッチング素子ない;逆に、ありません。
すなわち、最終的な出力シーケンスは、要件を満たすためです。
コードは以下の通りであります:
#******穷举法****** Python3.5 ****** インポートランダム デフ random_int_list(開始、停止、長さ): #产生随机序列 開始、=(INTを停止し()開始、INT(停止))場合、開始<=ストップ他(INT(停止)、INT(開始)) 長さ = INT(ABS(長さ))であれば長さが他0 random_list = [] のための I における範囲(長さ): random_list。 (random.randint(停止、開始))追加 リターンrandom_list A = random_int_list(1,100,5 ) B = random_int_list(1,100,5) T = [0 用の I における範囲(5)] のための I における範囲(5)] #の初期化シーケンス次元Tの 印刷(' A = '、A、' B = '、B、' T = ' 、T ) sum_a = SUM(A) sum_b = SUM(B) 分 = ABS(sum_a - sum_b) プリント(' sum_a = '、sum_a、' sum_b = '、sum_b、' 分= ' 、分) 印刷(" =============================================== ' ) のための I における範囲(5 ) のための J における範囲(5 ): T [I] [J] = ABS(sum_a -sum_b + 2 *(B [J] - [I])) プリント(' T = 'T) の印刷(' ========================================== ===== ' ) min_t = T [0] [0] のための I における範囲(5 ) のための J における範囲(5 ) 場合(> min_t T [I] [J]): min_t = T [I] [J] TEMP1 = iが TEMP2 = jで あれば分> min_t: TEMP = [TEMP1] [TEMP1] =のB [TEMP2] B [TEMP2] = 一時 プリント(' A = '、' B = '、B)