# len 0 1 2 3 4 5 6 7 8 9 10
Length_Price_Table = [0,1,5,8,9,10,17,17,20,24,30]
# 子问题最优解的表
Solve_Table = [0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
Cut_Table = [[0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], # Value
[0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], # cut len 1
[0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]] # cut len 2
# 运算计数
method_1_count = 0
method_2_count = 0
# 1 朴素递归循环
def CutRod(table, rod_len):
global Cut_Table
global method_1_count
method_1_count = method_1_count + 1
if(rod_len == 0):
return 0
max_value = -1
for i in range(1,rod_len+1):
new_value = table[i] + CutRod(table, rod_len - i)
if(new_value>=max_value):
max_value = new_value
len_1 = i
len_2 = rod_len - i
# 记录每个长度的最优切割方法
Cut_Table[0][rod_len] = max_value
Cut_Table[1][rod_len] = len_1
Cut_Table[2][rod_len] = len_2
return max_value
# 1.1 切割策略
def CutStrategy(Cut_Table, rod_len):
if(Cut_Table[1][rod_len]==0 or Cut_Table[2][rod_len]==0):
if(Cut_Table[1][rod_len]!=0):
print(Cut_Table[1][rod_len])
else:
print(Cut_Table[2][rod_len])
else:
CutStrategy(Cut_Table, Cut_Table[1][rod_len])
CutStrategy(Cut_Table, Cut_Table[2][rod_len])
return 0
# 2 带记录减少递归运算
def MemCutRod(solve_table, table, rod_len):
global method_2_count
method_2_count = method_2_count + 1
if(solve_table[rod_len] >= 0):
return solve_table[rod_len]
max_value = -1
for i in range(1,rod_len+1):
new_value = table[i] + MemCutRod(solve_table, table, rod_len - i)
if(new_value>max_value):
max_value = new_value
solve_table[rod_len] = max_value
return max_value
# 输入需要切割的长度
Rod_len = 8
print('Typical Method Best Price:')
print(CutRod(Length_Price_Table, Rod_len))
print('Typical Method Count:')
print(method_1_count)
print('最佳切割策略:')
CutStrategy(Cut_Table, Rod_len)
print('\n')
print('Top-Bottom Method Best Price:')
print(MemCutRod(Solve_Table, Length_Price_Table, Rod_len))
print('Top-Bottom Method Count:')
print(method_2_count)
相关文章: