中国科学技术大学软件学院
《算法设计与分析》
实验报告
姓 名: 丁 飞
学 号: SG13225013
指 导 教 师: 张 曙
专 业: 软设 1 班
中国科学技术大学软件学院 《算法设计与分析》实验报告
一.练手题 1:
1.实验内容:
整数划分类
输入:
每组输入是两个整数 n 和 k。(1 <= n <= 50, 1 <= k <= n)
输出:
对于每组输入,请输出六行。
第一行: 将 n 划分成若干正整数之和的划分数。
第二行: 将 n 划分成 k 个正整数之和的划分数。
第三行: 将 n 划分成最大数不超过 k 的划分数。
第四行: 将 n 划分成若干奇正整数之和的划分数。
第五行: 将 n 划分成若干不同整数之和的划分数。
第六行: 打印一个空行。
Sample Input
5 2
Sample Output
7
2
3
3
3
2.实验环境:
编码环境:Windows 7 + Eclipse Kepler + JDK1.7
代码示例:CSDN Blog 代码编辑器
3.实验分析:
问题 1:将 n 划分成若干正整数之和的划分数。
此问题可以转化为,将整数 n 划分为最大不超过 n 的若干个整数。则,参照问题 3 解题
思路。
- 1 -
中国科学技术大学软件学院 《算法设计与分析》实验报告
问题 2:将 n 划分成 k 个正整数之和的划分数。
此问题可分为三大类情况:
情况 1:n
k 又可划分为两种情况:
1.存在整数 1,则分配出一个 1,并继续将(n-1)划分给剩下的(k-1)个数;
2.不存在整数 1,则给 k 个数都先分配一个 1,而后再对这剩下的(n-k)划分成 k 个数;
由此,不难推导出算法递归式为
代码 1-1:
问题 3: 将 n 划分成最大数不超过 k 的划分数。
此问题可分为四大类情况:
情况 1:如果 n 或者 m 为 1,只有一种划分可能:{1}或{1,1,1....,1,1};
情况 2:如果 n中国科学技术大学软件学院 《算法设计与分析》实验报告
不难推出递归式为:
对于问题 1,使 n=m 即可。
代码 1-2:
问题 4:将 n 划分成若干奇正整数之和的划分数。
此问题可由 fun1 变形而来, 只需保证对奇偶数做不同的跳转即可。
当遇到偶数时:减 1 递归;
当遇到奇数时:在 fun1 算法的基础上,更改相关-1 操作为-2, 保证奇数性质, 再
做递归。
不难得到递归式为:
- 3 -
else )1fun1()fun1(mn )1fun1( 1mn )fun1(1 mor 1n 1)fun1(n,m-n-m,mn,n-n,nn,m
中国科学技术大学软件学院 《算法设计与分析》实验报告
代码 1-3:
- 4 -
mn )fun4(mn )2fun4()fun4(mn )2fun4(1odd is meven is m )1fun4( odd isn mn )1fun4(mn )2fun4()fun4(odd is meven is m )1fun4(even isn 1mor 1n 1)fun4(n,nn,m-n-m,mn,n-n,m-n,n-n,m-n-m,mn,m-n,m
中国科学技术大学软件学院 《算法设计与分析》实验报告
问题 5:将 n 划分成若干不同整数之和的划分数。
此问题可由问题 3 变形而来,即保证问题 3 算法中每次被调用形参 m 一定比 前 一
次运算调用时小。
不难推出递归式为:
代码 1-4:
- 5 -
else )1fun3()1fun3(mn )fun3(mn )1fun3(1m/2*m)(1n 02n 1)fun3(n,m-n-m,m-n,nn,m-n,m
中国科学技术大学软件学院 《算法设计与分析》实验报告
4.运行截图:
输入为 5,2 时:
截图 1-1:
输入为 11,3 时:
截图 1-2:
输入为 15,5 时:
截图 1-3:
- 6 -
中国科学技术大学软件学院 《算法设计与分析》实验报告
- 7 -