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
| package main
import (
"flag"
"fmt"
)
var (
size = flag.Int("size", 3, "size of array")
sum = flag.Int("sum", 0, "sum of two numbers")
)
func main() {
flag.Parse()
input := []int{10, 7, -5, 4, 8, 16, 35, -30, 91}
// for _, v := range chooseM(input, 8) {
// fmt.Println(v)
// }
fmt.Println(input)
fmt.Println(chooseSumN(input, *size, *sum))
}
func chooseM(data []int, m int) [][]int {
if len(data) < m {
return nil
}
if len(data) == m {
return [][]int{data}
}
if m == 1 {
var res [][]int
for _, v := range data {
res = append(res, []int{v})
}
return res
}
one := [][]int{}
rest := chooseM(data[1:], m-1)
for _, v := range rest {
m := append([]int{data[0]}, v...)
one = append(one, m)
}
return append(one, chooseM(data[1:], m)...)
}
func chooseSumN(data []int, m, n int) [][]int {
out := [][]int{}
for _, v := range chooseM(data, m) {
sum := 0
for _, i := range v {
sum += i
}
if sum == n {
out = append(out, v)
}
}
return out
}
|