最大k乘积问题---动态规划实验1

问题描述
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
例如
十进制整数 1234 划分为 3 段可有如下情形:
1 × 2 × 34 = 68
1 × 23 × 4 = 92
12 × 3 × 4 = 144
编程任务
对于给定的I 和k,编程计算I的最大k乘积。
数据输入
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)
实现提示
参考矩阵链乘问题 (参考了网上代码…
这次的动态规划函数是乘法的形式,值得学习,没有想出来。

#include <stdio.h>
#include <stdlib.h>
int m[101][101];//前i个数字 分成j段
int a[101];//存放数字
int cal(int a[],int i,int j)
{
    int value=0;
    while(j>=i)
    {
        value=value*10+a[i];
        i++;
    }
    return value;
}
int main()
{
    FILE *In,*Ou;
    int n,k,i,j;
    int num;
    int max,value;
    if((In=fopen("D:\\input.txt","r"))!=NULL)
    {
        fscanf(In,"%d %d",&n,&k);
        fscanf(In,"%d",&num);
        int i=n;
        while(num)
        {
            a[i]=num%10;i--;
            num/=10;
        }
        fclose(In);
    }
    else
    {
        printf("输入文件打开失败!\n");
    }
    if(k>=n)
    {
        printf("划分位数大于等于数字位数 输入不合法\n");
        return 0;
    }
    /*
    m[i][j]表示前i个数分成j段的最大乘积
    满足最优性原理 重叠子问题
    */
    m[1][1]=a[1];
    for(i=2;i<=n;i++)
        m[i][1]=m[i-1][1]*10+a[i];
    for(i=2;i<=k;i++){//分成多少段 统计到k段即可
        max=-1;
        for(j=i;j<=n;j++){//统计前j个元素分成i段的最大乘积
            int d;
            for(d=1;d<=j-1;d++){
                value=m[d][i-1]*cal(a,d+1,j);//把前d个数分成i-1段再乘上从d+1~j
                if(value>max)
                    max=value;
            }
            m[j][i]=max;
        }
    }
    if((Ou=fopen("D:\\output.txt","w"))!=NULL)
    {
        fprintf(Ou,"%d",max);
        fclose(Ou);
    }
    else
    {
        printf("输出文件打开失败\n");
    }
    return 0;
}

参考链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值