回答編集履歴
4
2018/05/31 11:38の質疑結果を反映
answer
CHANGED
@@ -13,6 +13,11 @@
|
|
13
13
|
|
14
14
|
…のようにしています。
|
15
15
|
|
16
|
+
追記:
|
17
|
+
> 仕様が漏れておりました、ある数値を超える場合は不可となります。
|
18
|
+
|
19
|
+
↑こちらを反映
|
20
|
+
|
16
21
|
```
|
17
22
|
// javascriptで実装
|
18
23
|
|
@@ -35,7 +40,8 @@
|
|
35
40
|
|
36
41
|
numbers.forEach((n)=>{
|
37
42
|
let div = Math.floor(goal / n);
|
43
|
+
//for(let i = 1; i < div + 2; i++){ // goalよりも大きい和を含む場合
|
38
|
-
for(let i = 1; i < div +
|
44
|
+
for(let i = 1; i < div + 1; i++){ // goalよりも大きい和を含まない場合
|
39
45
|
let arr = Array(i).fill(n);
|
40
46
|
let o = newNode(arr);
|
41
47
|
if(o.sum < goal){
|
3
ソースコード修正
answer
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
let nodelist = [];
|
32
32
|
numbers = numbers.sort((a,b)=>{ return b-a; });
|
33
33
|
// 重複する値を削除
|
34
|
-
numbers = numbers.
|
34
|
+
numbers = numbers.filter((n,i,arr)=>{return (i==0)||(arr[i-1]!=n);});
|
35
35
|
|
36
36
|
numbers.forEach((n)=>{
|
37
37
|
let div = Math.floor(goal / n);
|
2
誤字修正
answer
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
let nodelist = [];
|
32
32
|
numbers = numbers.sort((a,b)=>{ return b-a; });
|
33
33
|
// 重複する値を削除
|
34
|
-
numbers = numbers.sort((n,i,arr)=>{return (
|
34
|
+
numbers = numbers.sort((n,i,arr)=>{return (i==0)||(arr[i-1]!=n);});
|
35
35
|
|
36
36
|
numbers.forEach((n)=>{
|
37
37
|
let div = Math.floor(goal / n);
|
1
numbersに重複値があった場合の処理を追加
answer
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
「ある数値」をgoalとし、「複数の数値」をnumbersとしています。
|
7
7
|
|
8
8
|
1.numbersを降順に並べ替え
|
9
|
-
2.numbersの
|
9
|
+
2.numbersの各要素で( goal <= number * n )となる最初のn(n>0)までの組み合わせを保持するNodeを作成
|
10
|
-
3.( goal > number * n )となるNodeだけ、「goal = goal - number * n」「
|
10
|
+
3.( goal > number * n )となるNodeだけ、「goal = goal - number * n」「 numbers = [2で使った要素よりも小さい数で再構成したnumbers]」として、1-3を再帰的に実行
|
11
11
|
4.rootNodeから各Nodeまでで保持する数値の組み合わせをすべてリスト化
|
12
12
|
5.4のリストの各要素の合計値とgoalを比較し、差分が最小のものを解として出力
|
13
13
|
|
@@ -30,6 +30,8 @@
|
|
30
30
|
let createTree = (goal, numbers)=>{
|
31
31
|
let nodelist = [];
|
32
32
|
numbers = numbers.sort((a,b)=>{ return b-a; });
|
33
|
+
// 重複する値を削除
|
34
|
+
numbers = numbers.sort((n,i,arr)=>{return (n==0)||(arr[i-1]!=n);});
|
33
35
|
|
34
36
|
numbers.forEach((n)=>{
|
35
37
|
let div = Math.floor(goal / n);
|