最大K乘积

实验内容:

一、算法实现题:

①问题描述

I 是一个n 位十进制整数。如果将I 划分为k 段,则可得到k 个整数。这k 个整数的乘积称为I 的一个k 乘积。

对于给定的I nk,试设计一个算法,编程计算I 的最大k 乘积。

②编程任务

对于给定的I nk,试设计一个算法,编程计算I 的最大k 乘积。

③样例输入文件示例                         输出文件示例

Intput                               output

2 1                                  15

15

二、解题思路:

4、实验方法步骤及注意事项:

①实验步骤:

找出最优解的性质,并刻画其结构特征

递归地定义最优值

以自底向上的方式计算出最优值

根据计算最优值时得到的信息,构造最优解

②解题思路

1)   首先用反证法证明最大k乘积问题具有最优子结构性质。

假设n位十进制整数I的最大k乘积记为fnk),前k-1段总共是m位,且1<=m<n,则最后一段为n-m位,用I(m,n-m)表示从第m位开始的最后n-m位十进制数,f(nk)=f(m,k-1)*I(m,n-m).现在我们假设前面m位十进制整数的最大k-1乘积不是f(m,k-1),而是e(m,k-1),则有e(m,k-1)>f(m,k-1), 左右两边同时乘以I(m,n-m)e(m,k-1)*I(m,n-m)>f(m,k-1)*I(m,n-m)=f(n,k) f(n,k)不是I的最大K乘积与最初的假设相矛盾。所以f(m,k-1)是前面m位十进制整数的最大k-1乘积,即最大k乘积问题具有最优子结构性质。

2)   列出计算最优值的递归式,并以n=4k=3,I=3456为例,在草稿纸上求出最优值。回答问题:何为最大k乘积问题的最优解,何为最大k乘积问题的最优解?

答:最大K乘积问题的最优解指的是解最大K乘积问题的一种方案,即是如何对n进行K段划分,最优值指的是在最优解的情况下得到最大K乘积的一个结果

3)   给出使用动态规划法计算最优值的算法,用C++语言描述

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int ck(int i,int j,string str)

{

     string str1=str.substr(i,j);

     return atoi(str1.c_str ());

}

void kk(int n ,int m,int **f,int **ka,string str)

{

     int i,j ,k;

     int tmp,max,t;

     for (i=1;i<=n;i++)

         f[i][1]=ck(0,i,str);

     for (j=2;j<=m;j++)

         for(i=j;i<=n;i++)

         {

              for (k=1,tmp=0;k<i;k++)

             {

                   max=f[k][j-1]*ck(k,j-k,str);

                 if (tmp<max){tmp=max;t=k;}

             }

              f[i][j]=tmp;ka[i][j]=t;

         }

         ofstream fout("output.txt");

         fout<<f[m][n]<<endl;

}

int main()

{

     int n,m;

     int **f,**ka;

     string str;char s[11];

     ifstream fin("input.txt");

     fin>>n>>m>>str;

     if((n<m)||(n==0)) {cout<<0<<endl;return 0;}

     fin>>s;

    str = s;

    if (m != str.size()) {cout<<0<<endl;return 0;}

     f = new int *[m+1];

    for(int i = 0;i <= m;i++)

         f[i] = new int [n+1];

    ka = new int *[m+1];

    for(int i = 0;i <= m;i++)

         ka[i] = new int [n+1];

     kk(n,m,f,ka,str);

     return 1;

}

4)最大k乘积问题是要求出最优值还是最优解

最大K乘积问题是要求出最优值

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值