最佳加法表达式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()