2016-08-19 11 views
-2

配列から可能な限り最小の合計を求めています。例えば配列{1,2,3,4}の場合今私は上記の配列から最小可能な合計を見つけることを望む(1 + 2)=3(3+3)=6(4+6)=10のように。これは3+6+10=19につながります。最適なソリューションは何でしょうか?配列内のすべての数値を使用して最小可能合計を見つけます。

+4

?どのような文脈ですか?そして何か試してみてください。何を試しましたか?あなたはインターネットを検索していますか? – Randy

+6

私は19がどこから来るのか分かりません。その配列の合計は10です。任意の配列の最小可能な合計は最小の要素です。すべての数字を使うということは、とにかくすべてを追加する必要があることを意味します。 –

+1

@ cricket_007 '1 + 2 = 3'、新しいリスト=' {3、3、4} '。 '3 + 3 = 6'、新しいリスト=' {4,6} 'などのようになります。 –

答えて

0

最小値を見つけて削除し、最初の値が削除された後に次の最小値を見つけ出し、2つを加算します。

5
  1. ソートリスト低>
  2. 高い合計2つの最小値( low1+low2 = pair)、 low1除去 low2と総
  3. リゾートリストにそれを追加し、pair
  4. を含ま繰り返し2-3 1まで値が最小化される総
  5. 合計にそれを追加し、残る

証拠であります最適なエンコーディングのハフマンエンコードの証明JavaScriptで

+0

答えが得られませんでした。 1つの値は何ですか?私はlow1とlow2を削除する必要がありますか? – huk

+0

の値が1になるまで、low1とlow2を配列から削除してください。 –

+0

@KevinL実際には、あなたが私の答えで見ることができるように、low1はlow1とlow2の合計で置き換えられる可能性があります。 – Randy

0

と同じ:

let x = [1, 2, 2, 2, 3]; 
 
let y = []; 
 

 
// check if we have more then 2 values left in the array 
 
while(x[1] != undefined) 
 
    // sort to make sure we get lowest values combined 
 
    // add lowest two values, remove the second 
 
    // push result in new array 
 
    x.sort() && y.push(x[0] = x[0] + x.splice(1, 1)[0]); 
 

 
// add all results 
 
let result = y.reduce((a, b) => a + b, 0); 
 

 
console.log(result);

あなたは、あなたがそれに渡すすべての配列のためにこれを行う関数を作成することができます。非常にクールなあなたは、関数型プログラミングにしている場合:どのような言語で

const array = [1, 2, 2, 2, 3]; 
 

 
const add = (x, y = []) => (
 
    (x, y) => x.sort() && 
 
     y.push(x[0] = x[0] + x.splice(1, 1)[0]) && 
 
     x[1] ? 
 
     add(x, y) : 
 
    y.reduce((a, b) => a + b, 0))(x.slice(), y); 
 

 
console.log(add(array)); 
 

 
// the original array is unmodified 
 
console.log(array);

+0

私は、あなたが常に最低の2つの値を合計するために配列を利用しないので、これが最適でない値を与えることはほとんど確信しています。あなたのアルゴリズムは[1,2,2,2,3]に対して25を与えますが、最適な合計は23 –

+0

@ KevinLです。私はそれが必要条件であるとは気付かなかった。更新しました。 – Randy

関連する問題