算法分析与设计实验-最大K乘积问题

最大K乘积问题

问题描述

设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
编程任务;
对于给定的I 和k,编程计算I 的最大k 乘积。
数据输入:
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)。

实验设计

求一个i位的数分解为j个 部分后的最大积,等于求k位(1<=k 可得出动态规划方程:
m[i][j]=num[1:i] j==1
m[i][j]= m[k][j-1]num[k+1:i],j>1
从文件中读取数据 with open(inputfilename) as file_object:
解析字符串获取数据和列表
n,k=eval(mater[0][0]),eval(mater[0][1])
num=list(mater[1])
核心算法:
def divide(n,k,num):
创建二维列表
当分成一段时,返回值
for i in range(1,k):#分成2-k段
for j in range(i,n): #前j个数分成i段
for d in range(i,j+1):#前d个数分成i-1段,d+1个数为第i段
前i-1段与-段乘积最大值
在m[i][j]处保存
return m;
#计算从高位数第i位到第j位组成的数字
def cal(num,i,j):
value=0
while j>=i:
value=value
10+eval(num[i])
i=i+1;
return value
#将结果存入文件output.txt
file=open(outputfilename,“w”)
file.write(str(m[k-1][n-1]))

实验代码

#coding=gbk
#coding:utf-8
'''
Created on 2020年6月17日
最大K乘积问题
@author: XXXX
'''
import numpy
numpy.set_printoptions(suppress=True)
inputfilename='D:\算法分析与设计/test2_1_input.txt' #输入文件路径
outputfilename='D:\算法分析与设计/test2_1_output.txt'
#计算从高位数第i位到第j位组成的数字
def cal(num,i,j):
    value=0
    while j>=i:
        value=value*10+eval(num[i])
        i=i+1;  
    return value
def divide(n,k,num):
    m=[[0 for i in range(n)] for j in range(k)]
    m[0][0]=eval(num[0])                   
    for i in range(1,n):    #分成一段时             
        m[0][i]=m[0][i-1]*10+eval(num[i]) 
    for i in range(1,k):#分成2-k段
         max=-1
         for j in range(i,n):   #前j个数分成i段
            
            for d in range(i,j+1):#前d个数分成i-1段,d+1个数为第i段
                 value=m[i-1][d-1]*cal(num,d,j)
                 if(value>max):
                     max=value
            m[i][j]=max        
    return m;                   
if __name__ == '__main__':   
    with open(inputfilename) as file_object:
        mater=file_object.read()
    mater=mater.split('\n')
    mater[0]=mater[0].split()
    n,k=eval(mater[0][0]),eval(mater[0][1])
    num=list(mater[1])
    m=divide(n,k,num)
    #输出结果用于验证
    for i in range(0,k):
        print(m[i])
    print("最大k乘积为:",m[k-1][n-1]) 
    #将结果存入文件output.txt
    file=open(outputfilename,"w")
    file.write(str(m[k-1][n-1]))
file.close()

你可能感兴趣的:(算法分析与设计实验)