>>> semi_perfect(0) True >>> semi_perfect(1) True >>> semi_perfect(12) True >>> semi_perfect(13) False # >>> semi_perfect(-12) # True
(number: int)
| 49 | |
| 50 | |
| 51 | def semi_perfect(number: int) -> bool: |
| 52 | """ |
| 53 | >>> semi_perfect(0) |
| 54 | True |
| 55 | >>> semi_perfect(1) |
| 56 | True |
| 57 | >>> semi_perfect(12) |
| 58 | True |
| 59 | >>> semi_perfect(13) |
| 60 | False |
| 61 | |
| 62 | # >>> semi_perfect(-12) |
| 63 | # True |
| 64 | """ |
| 65 | values = factors(number) |
| 66 | r = len(values) |
| 67 | subset = [[0 for i in range(number + 1)] for j in range(r + 1)] |
| 68 | for i in range(r + 1): |
| 69 | subset[i][0] = True |
| 70 | |
| 71 | for i in range(1, number + 1): |
| 72 | subset[0][i] = False |
| 73 | |
| 74 | for i in range(1, r + 1): |
| 75 | for j in range(1, number + 1): |
| 76 | if j < values[i - 1]: |
| 77 | subset[i][j] = subset[i - 1][j] |
| 78 | else: |
| 79 | subset[i][j] = subset[i - 1][j] or subset[i - 1][j - values[i - 1]] |
| 80 | |
| 81 | return subset[r][number] != 0 |
| 82 | |
| 83 | |
| 84 | def weird(number: int) -> bool: |