Backtracking: Dynamic solution first working version

This commit is contained in:
2025-09-24 19:29:44 -04:00
parent 67d08e827d
commit 16acd96a27

View 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()