收藏 分享(赏)

动态规划k乘积问题.doc

上传人:HR专家 文档编号:11507455 上传时间:2020-05-15 格式:DOC 页数:6 大小:50.67KB
下载 相关 举报
动态规划k乘积问题.doc_第1页
第1页 / 共6页
动态规划k乘积问题.doc_第2页
第2页 / 共6页
动态规划k乘积问题.doc_第3页
第3页 / 共6页
动态规划k乘积问题.doc_第4页
第4页 / 共6页
动态规划k乘积问题.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 动态规划k乘积问题 专业名称: 班 级: 学生姓名: 学号(8位): 指导教师: 实验日期: 2016年 月 日一. 实验目的及实验环境 实验目的: 熟悉并掌握贪心算法 实验环境: windows7 vc6.0编译器二. 实验内容题目描述: 设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积,试设计一个算法,对于给定的I和k,求出I的最大k乘积。算法设计: 对于给你定的I和看k,计算I的最大k乘积问题。 数据输入: 由文件input.txt 提取输入数据。文件的第1行中有2个正整数n

2、和k。正整数n是序列的长度,正整数k是分割的段数。在接下来的一行中是一个n位十进制整数。 结果输出: 将计算计算结果输出到文件output.txt,文件第一行中的数是计算出的最大k乘积。三方案设计 1.分析最优解的结构为了方便起见,设I(s,t)是I的由s位开始的t位数字组成的十进制数,R(i,j)表示I(0,i)的j乘积。第j段的起始位置为第w位,1wj。则有如下关系R(i,j) = R(i,j-1)I(w,j-w)要使R(i,j)最大,则R(i,j-1)也是最大,所以最大乘积问题的最优解包含其子问题的最优解。2.建立递归关系设MaxIij表示I(0,i)的最大j乘积,则原问题的最优值为Ma

3、xInk。当k1时,MaxIn1 = I(0,n);当k1时,可利用最优子结构性质计算MaxInk,若计算MaxInk的第k段的起始位置为第w位,1wj,则有MaxInk = MaxIwk-1I(w,n-w)。由于在计算时并不知道第k段的起始位置w,所以w还未定。不过w的值只有n-k+2种可能,即k-1wn。所以MaxInk可以递归地定义为I(0,n)k1MaxInk =maxMaxIwk-1I(w,n-w)k1MaxInk给出了最优值,同时还确定了计算最优的断开位置w,也就时说,对于这个w有MaxInk = MaxIwk-1I(w,n-w)若将对应于MaxInk的断开位置w记为demarca

4、tionnk后,可递归地由demarcationnk构造相应的最优解。四测试数据及运行结果正常测试数据(3组)及运行结果;输入5位的数,分成3段输入6位的数,分6段五总结1实验过程中遇到的问题及解决办法;2对设计及调试过程的心得体会。六附录:源代码(电子版)#include#include#include#define MAXN 51#define MAXK 10/mij表示1i十进制位分成j段所得的最大乘积long mMAXKMAXN=0,0 ;/wij表示ij十进制位所组成的十进制数long wMAXNMAXN=0,0 ;int leafMAXNMAXN = 0,0;void maxdp(

5、int n,int k,int *a)int i,j,d;long temp,max;for(i=1; i= n; i+) /分成一段 mi1 = w1i; for(i=2 ; i= n ; i+) /DP 过程for(j=2; j= k ; j+) max = 0;for(d=1; d max)max = temp ;leafij=d;mij = max ; printf(n);printf(n);for(i=1;i=n;i+)for(j=1;j=n;j+)printf(%ldt,mij);printf(n);printf(n);for(i=1;i=n;i+)for(j=1;j 0)stac

6、ktop+ = tmp;k-;printf(Divided sequence:n);i = 1;while (-top) = 0)tmp = stacktop;for ( ; i = tmp; i+)printf(%d, datai);printf( );for (; i = n; i+)printf(%d, datai);printf(n);int main(void)int n,k,i,j;int aMAXN=0,la=0;char c ;scanf(%d %d ,&n,&k); /input n, kwhile ( ( c=getchar() )!=#) /read integera+la = c-0 ;for(i=1 ; i= n; i+)wii= ai ;for(j=i+1 ; j= n; j+)wij = wij-1*10 + aj ;for(i=1;i=n;i+)for(j=1;j=n;j+)printf(%ldt,wij);printf(n); maxdp(n,k,a) ;printf(%ldn,mnk) ;print_foot(a, n, k);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报