-
Notifications
You must be signed in to change notification settings - Fork 0
/
solve.dart
73 lines (61 loc) · 2.31 KB
/
solve.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import 'dart:io';
void main() {
List<double> resultList = [62.13, 26.67, 17.76];
List<double> targetList = [24.92,5.88,5.04,3.64,3.45,3.36,2.8,2.8,2.52,2.24,2.24,2.24,1.96,1.96,1.8,1.68,1.4,1.4,1.4,1.2,1.2,1.15,1.12,1.12,1.12,1.12,1.12,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.56,0.4,0.4,0.4,0.4,0.4,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28,0.28];
// List<double> resultList = [52.7,8.96];
// List<double> targetList = [21.44,6.72,5.44,5.12,4.48,3.20,2.24,1.92,1.92,1.92,1.28,1.28,1.00,0.96,0.50,0.32,0.32,0.32,0.32,0.32,0.32,0.32];
List<int> intResultList = [];
List<int> intTargetList = [];
for (double i in resultList) {
intResultList.add((i * 100).round());
}
for (double i in targetList) {
intTargetList.add((i * 100).round());
}
if (intResultList.reduce((v, e) => v + e) != intTargetList.reduce((v, e) => v + e)) {
print('no answer');
exit(0);
}
intResultList.sort();
intTargetList.sort();
void println(List<int> bused) {
print('***************************');
for (int i = 0; i < intResultList.length; i++) {
stdout.write('${intResultList[i] / 100}: ');
List<double> outList = [];
for (int j = 0; j < intTargetList.length; j++) {
if (bused[j] == i) {
outList.add(intTargetList[j] / 100);
}
}
print(outList);
print('***************************');
}
}
void calc(List<int> bused, int s, int index, int begin) {
for (int i = begin; i < intTargetList.length; i++) {
if (bused[i] > 0) {
continue;
}
if (i > 0 && intTargetList[i - 1] == intTargetList[i] && bused[i - 1] == 0) {
continue;
}
if (intTargetList[i] > s) {
break;
} else {
bused[i] = index;
if (intTargetList[i] < s) {
calc(bused, s - intTargetList[i], index, i + 1);
} else if (index + 1 < intResultList.length) {
calc(bused, intResultList[index + 1], index + 1, 0);
} else {
println(bused);
exit(0);
}
bused[i] = 0;
}
}
}
List<int> newList = List.generate(intTargetList.length, (_) => 0);
calc(newList, intResultList[1], 1, 0);
}