回答編集履歴

1

スペルミス訂正、解説を細かくしました

2019/01/23 17:04

投稿

Kota_Kappa
Kota_Kappa

スコア116

test CHANGED
@@ -8,13 +8,13 @@
8
8
 
9
9
  for(int total=0;total<8;total++){
10
10
 
11
- for(int num2=0;num2<=all;num2++){
11
+ for(int num2=0;num2<=total;total++){
12
12
 
13
13
  for(int num1=0;num1<=(total-num2);num1++){
14
14
 
15
15
  int rieki=tiiki2_rieki[num2]+tiiki1_rieki[num1]+tiiki0_rieki[total-num2-num1];
16
16
 
17
- if(tiiki2_haken[0][totall]<rieki){
17
+ if(tiiki2_haken[0][total]<rieki){
18
18
 
19
19
  tiiki2_haken[0][total]=rieki;
20
20
 
@@ -84,4 +84,18 @@
84
84
 
85
85
  こんな感じで作りました。
86
86
 
87
+ 10通りの中に、同じ最大値を持つものが複数でてきます。(総数3以外の場合でも)
88
+
89
+ 上だと、0-1-2と2-0-1の組などはいずれも最大値16になります。
90
+
91
+ しかし地域2への派遣人数を0で出力するには、0-1-2の組でtiiki2_haken[1][3]を確定しなければなりません。
92
+
93
+ そのため、forは地域2から先に回しています。
94
+
95
+ 最も内側のifは、「計算した利益が最大値を更新した場合」に配列を更新する仕組みなので、
96
+
97
+ 0-1-2の組を後に回すと最大値を更新できずに、tiiki2_haken[1][3]=0になりません。
98
+
99
+
100
+
87
101
  もっと素晴らしいアルゴリズムがでてきたら、そちらも学んでみてください。