西 安 邮 电 大 学
(计算机学院)
课内实验报告
实验名称: 贪心算法
专业名称: 计算机科学与技术
班 级:
学生姓名:
学号(8位):
指导教师:
实验日期: 2015年6月2日
一. 实验目的及实验环境
实验目的:掌握贪心算法
实验环境:软件平台:Eclipse 集成开发环境
操作系统:Ubuntu15.04
二 .实验内容
设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,并
且使这些自然数的乘积最大,对于给定的正整数n,编程计算最优分解方案。
三.方案设计
1.把一个正整数从中间分开(如果是偶数直接除以2如果是奇数,分别加1除以2,减1除以2)
2.其中一部分保留在A[]数组中(奇数的话,比较大的那一部分保留给A[]数组),另一部分赋给temp,并重复1,2 步骤
3.最后把temp赋给A[]数组
四.测试数据及运行结果
正常测试数据(3组)及运行结果;
五.总结
1. 实验过程中遇到的问题及解决办法;
2. 对设计及调试过程的心得体会。
六.附录:源代码(电子版)
package com.mhc.learn;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class exp4 {
/**
* 最优分解问题
* 问题描述:设n是一个正整数。现在要求将n分解为若干互不相同的自然数之和,且使这些自然数的乘积最大
* 设计算法:对于给定的正整数n,计算最优分解方案
* 数据输入:由文件input4.txt提供输入数据,文件的第1行是正整数n
* 结果输出,将计算的最大乘积输出到文件output.txt
*
* 示例:输入10 输出30(2,3,5)
*/
/**
* 从文件中解析出三个整数
*/
static int n;
static final int N = 10;//数组大小
public static void readFile(){
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(“/home/mhc/test/input4.txt”));
int read=-1;
while((read=fis.read())!=-1){
n = read;
}
System.out.println(“n=”+n);;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void max(int number){
if(number == 1 || number == 2){
System.out.println(“不分解为相同的自然数之和”);
System.out.println(“最大乘积是”+number);
return;
}else if(number == 3){
System.out.println(“该数被分解为:3=2+1”);
System.out.println(“最大乘积是”+2);
return;
}else if(number == 4){
System.out.println(“该数被分解为:4=3+1”);
System.out.println(“最大乘积是”+ 3);
}
int i,x,m=1;
int len = number/2,n=number,p=1;
int [] num = new int[len];
//初始化数组
for(i=0;i<len;i++){
num[i] = 0;
}
num[0] = 2;
number-=2;
//将number分解为从2开始的连续数字之和
for (i = 0; number > num[i]; i++) {
num[i+1] = num[i]+1;
number-=num[i+1];
}
//System.out.println(num[0]);
x=i+1;
//System.out.println(“number=”+number+”===i=”+i);
// 剩下一个数,将此数在后项优先的方式下均匀地分给前面各项
while(number!=0){
num[i]++;
number–;//比如n= 10 数组中的//2 3 4 1变成//2 3 5 1
i=(i-1+x)%x;//i往前移动一个
}
//求最大乘积
for (i = 0; i < x; i++) {
System.out.print(num[i]+”*”);
p*=num[i];
}
System.out.print(“该数被分解为:”+n+”=”+num[0]);
for (i=1; i< x; i++) {
System.out.print(“+”+num[i]);
}
System.out.println();
System.out.println(“最大乘积是:”+p);
}
public static void main(String[] args) {
// int w[] = new int[N/2];//不重复的数字不会超过N的一般
// int max = 0;//储存最大的乘积值
readFile();
max(n);
}
}