[最优化方法]动态规划 - 钢条切割问题

# 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)

[最优化方法]动态规划 - 钢条切割问题