Backtracking: Dynamic solution first working version
This commit is contained in:
68
Backtracking/cs412_rockets_dynamic.py
Normal file
68
Backtracking/cs412_rockets_dynamic.py
Normal file
@@ -0,0 +1,68 @@
|
||||
"""
|
||||
name: Nicholas Tamassia
|
||||
|
||||
Honor Code and Acknowledgments:
|
||||
|
||||
This work complies with the JMU Honor Code.
|
||||
|
||||
Comments here on your code and submission.
|
||||
"""
|
||||
|
||||
|
||||
def construct(sections: list[int], target: int) -> list[tuple[int, int]]:
|
||||
s: list[int] = sorted(sections, reverse=True)
|
||||
n: int = len(s)
|
||||
|
||||
IMPOSSIBLE: int = target + 1
|
||||
|
||||
memo: list[list[int]] = [([IMPOSSIBLE] * (target + 1)) for _ in range(0, n + 1)]
|
||||
|
||||
for i in range(n + 1):
|
||||
memo[i][0] = 0
|
||||
|
||||
for i in range(n - 1, -1, -1):
|
||||
for t in range(1, target + 1):
|
||||
skip: int = memo[i + 1][t]
|
||||
|
||||
t_new: int = t - s[i]
|
||||
use: int = memo[i][t_new] + 1 if t_new >= 0 else IMPOSSIBLE
|
||||
|
||||
memo[i][t] = min(skip, use)
|
||||
|
||||
total_sections: list[int] = [0] * n
|
||||
|
||||
i, t = 0, target
|
||||
|
||||
while i < n or t > 0:
|
||||
skipped: int = memo[i + 1][t]
|
||||
|
||||
t_new2: int = t - s[i]
|
||||
used: int = memo[i][t_new2] + 1 if t_new2 >= 0 else IMPOSSIBLE
|
||||
|
||||
if used <= skipped:
|
||||
total_sections[i] += 1
|
||||
t -= s[i]
|
||||
else:
|
||||
i += 1
|
||||
|
||||
return list(zip(s, total_sections))
|
||||
|
||||
|
||||
# All modules for CS 412 must include a main method that allows it
|
||||
# to imported and invoked from other python scripts
|
||||
def main():
|
||||
sections: list[int] = list(map(int, input().split()))
|
||||
target: int = int(input())
|
||||
|
||||
best_sections: list[tuple[int, int]] = construct(sections, target)
|
||||
total: int = 0
|
||||
|
||||
for i, n in sorted(best_sections):
|
||||
total += n
|
||||
print(f"{n} of length {i}")
|
||||
|
||||
print(f"{total} rocket sections minimum")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user