teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

2018/05/31 11:38の質疑結果を反映

2018/05/31 09:00

投稿

tkturbo
tkturbo

スコア5572

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 + 2; i++){
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

ソースコード修正

2018/05/31 09:00

投稿

tkturbo
tkturbo

スコア5572

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 (i==0)||(arr[i-1]!=n);});
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

誤字修正

2018/05/31 00:57

投稿

tkturbo
tkturbo

スコア5572

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 (n==0)||(arr[i-1]!=n);});
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に重複値があった場合の処理を追加

2018/05/31 00:56

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -6,8 +6,8 @@
6
6
  「ある数値」をgoalとし、「複数の数値」をnumbersとしています。
7
7
 
8
8
  1.numbersを降順に並べ替え
9
- 2.numbersの最初の要素で( goal <= numbers * n )となる最初のnまでの組み合わせを保持するNodeを作成
9
+ 2.numbersの要素で( goal <= number * n )となる最初のn(n>0)までの組み合わせを保持するNodeを作成
10
- 3.( goal > number * n )となるNodeだけ、「goal = goal - number * n」「 number = [2で使った要素よりも小さい数で再構成したnumbers]」として、1-3を再帰的に実行
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);