(array []int, sum int)
| 13 | var ErrNegativeSum = fmt.Errorf("negative sum is not allowed") |
| 14 | |
| 15 | func IsSubsetSum(array []int, sum int) (bool, error) { |
| 16 | if sum < 0 { |
| 17 | //not allow negative sum |
| 18 | return false, ErrNegativeSum |
| 19 | } |
| 20 | |
| 21 | //create subset matrix |
| 22 | arraySize := len(array) |
| 23 | subset := make([][]bool, arraySize+1) |
| 24 | for i := 0; i <= arraySize; i++ { |
| 25 | subset[i] = make([]bool, sum+1) |
| 26 | } |
| 27 | |
| 28 | for i := 0; i <= arraySize; i++ { |
| 29 | //sum 0 is always true |
| 30 | subset[i][0] = true |
| 31 | } |
| 32 | |
| 33 | for i := 1; i <= sum; i++ { |
| 34 | //empty set is false when sum is not 0 |
| 35 | subset[0][i] = false |
| 36 | } |
| 37 | |
| 38 | for i := 1; i <= arraySize; i++ { |
| 39 | for j := 1; j <= sum; j++ { |
| 40 | if array[i-1] > j { |
| 41 | subset[i][j] = subset[i-1][j] |
| 42 | } |
| 43 | |
| 44 | if array[i-1] <= j { |
| 45 | if j-array[i-1] < 0 || j-array[i-1] > sum { |
| 46 | //out of bounds |
| 47 | return false, ErrInvalidPosition |
| 48 | } |
| 49 | |
| 50 | subset[i][j] = subset[i-1][j] || subset[i-1][j-array[i-1]] |
| 51 | } |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | return subset[arraySize][sum], nil |
| 56 | } |
no outgoing calls