zoukankan      html  css  js  c++  java
  • 动态规划-最佳加法表达式V1

    最佳加法表达式V1:
    描述
    给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的
    加法表达式的值最小,并输出该值。例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36
    输入
    有不超过15组数据
    每组数据两行。第一行是整数m,表示有m个加号要放( 0<=m<=50)
    第二行是若干个数字。数字总数n不超过50,且 m <= n-1
    输出
    对每组数据,输出最小加法表达式的值

    样例输入
    2
    123456
    1
    123456
    4
    12345
    样例输出
    102
    579
    15
    """

    """
    递归实现:
    设V(m,n)表示在n个数字中插入m个加号所能形成的表达式最小值。
    假定数字串长度是n,添完加号后,表达式的最后一个加号添加在第i个数字后面,
    那么整个表达式的最小值,就等于在前i个数字中插入 m – 1个加号所能形成的
    最小值,加上第i+1到第n个数字所组成的数的值。
    设V(m,n)表示在n个数字中插入m个加号所能形成的表达式最小值,那么:
    if m = 0
    V(m,n) = n个数字构成的整数
    else if n < m + 1
    V(m,n) = ∞
    else
    V(m,n) = Min{ V(m-1,i) + Num(i+1,n) } ( i = m … n-1)
    i的最小的取值是m,因为如果再小了,m个加号就放不完,对i的从m至n-1每个位置都
    遍历,计算出多个V(m,n)的值,取最小值既是答案。
    """

    # 把输入的数字字符串,把每个位置数字的值存在二维数组,假设m=2,n=1234,
    # 为了方便从1开始计算,所以多增加0为第一行,其数组内容为:
    # [[0, 0, 0, 0, 0],
    # [0, 1, 12, 123, 1234],
    # [0, 0, 2, 23, 234],
    # [0, 0, 0, 3, 34],
    # [0, 0, 0, 0, 4]]

    python算法实现:
     1 matrix_value = []
     2 
     3 
     4 def V(m, n):
     5     global matrix_value
     6     # m个加号,n个数字
     7     if m == 0:
     8         return matrix_value[1][n]
     9     elif n < m+1:
    10         # 说明加号过多,没法放完加号,所以条件不成立,返回无穷大
    11         # n个数字,最多可以放n-1个加号,n-1=m,这个就是m的最大值,如果n-1<m,说明m加号过多
    12         return float('inf')
    13     else:
    14         #初始假设无穷大是最小值
    15         min_value = float("inf")
    16         for i in range(m, n):
    17             temp = V(m-1, i) + matrix_value[i+1][n]
    18             min_value = min(min_value, temp)
    19 
    20         return min_value
    21 
    22 
    23 def main():
    24     # m个加号
    25     m = int(input())
    26     # numList把数组字符串转换为列表
    27     num_list = list(str(input()))
    28     # n个数字
    29     n = len(num_list)
    30     # 把n个数字的值存在一个二维数组中
    31     global matrix_value
    32     matrix_value = [[0] * (n+1) for i in range(n+1)]
    33     num_list = [int(i) for i in num_list]
    34     #为了遍历从1开始计算,所以在前面再增加个0
    35     num_list.insert(0, 0)
    36     # matrix_value二维数组存储字符串数字构成的各种数值
    37     for i in range(1,len(num_list)):
    38         for j in range(i,len(num_list)):
    39             matrix_value[i][j] = matrix_value[i][j - 1] * 10 + num_list[j]
    40     min_value = V(m, n)
    41     print("加法最佳表达式的最小值:%.2f"%min_value)
    42 
    43 
    44 if __name__ == '__main__':
    45     main()


  • 相关阅读:
    [转]在 javascript 按键事件中,按键值的对照表
    表达式树(Expression Tree)
    WPF之路——用户控件对比自定义控件UserControl VS CustomControl)
    wpf创建用户控件(计时器控件)
    WPF 命令
    WPF自定义DataGrid分页控件
    WPF ----在UserControl的xaml里绑定依赖属性
    wpf 自定义ListBox
    WPF 自定义NotifyPropertyChanged
    WPF 使用附加属性增加控件属性
  • 原文地址:https://www.cnblogs.com/an-wl/p/12975485.html
Copyright © 2011-2022 走看看