贪心算法之最优分解(实验报告版)

 

       西 安 邮 电 大 学

            (计算机学院)

 

课内实验报告

 

实验名称:         贪心算法

 

 

 

 

 

 

 

    专业名称:       计算机科学与技术

班    级:           

    学生姓名:         

学号(8位):   

指导教师:           

实验日期:        2015年6月2日

 

 

 

 

 

 

 

一. 实验目的及实验环境

实验目的:掌握贪心算法

实验环境:软件平台:Eclipse 集成开发环境

          操作系统:Ubuntu15.04

二 .实验内容

   设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,并    

   且使这些自然数的乘积最大,对于给定的正整数n,编程计算最优分解方案。

三.方案设计

    1.把一个正整数从中间分开(如果是偶数直接除以2如果是奇数,分别加1除以2,减1除以2

    2.其中一部分保留在A[]数组中(奇数的话,比较大的那一部分保留给A[]数组),另一部分赋给temp,并重复1步骤

    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);

}

}

 

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/mhc9348/article/details/46598435
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞