贪心算法程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

贪心算法程序设计

实验目的:掌握贪心算法。

实验内容:设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。对于给定的正整数n,编程计算最优分解方案。

实验要求:利用贪心算法思想写出算法的伪代码和C程序代码。

(一)算法思想

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

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

3)最后把temp赋给A[]数组

(二)程序代码

//贪心算法

import java.io.*;

public class Testsuanfa {

public int N = this.GetN();

public int[] A = new int[100];

// 取得用户需要实现算法的一个正整数

public int GetN() {

int dvalue = 0;

String value;

System.out.println("请输入一个正整数: ");

BufferedReader bfr = new BufferedReader(

new InputStreamReader(System.in));

try {

value = bfr.readLine();

dvalue = Integer.parseInt(value);

//如果输入的不是数字,系统自动退出,并提示:“输入正确的数值!”。

} catch (IOException e) {

System.out.println("输入出错了,请重新输入:");

System.exit(0);

} catch (NumberFormatException e2) {

System.out.println("请输入正确的数字!!");

System.exit(0);

}

return dvalue;

}

public void f() {

int count = 0;

int sum = 0;

// 将这个数分解:从2到i(直到这些数的和sum大于N)

for (int i = 0; sum < N; i++) {

sum = 2 + i + sum;

A[i] = 2 + i;

count++;

}

// 如果sum比N大1,即把2去掉,其他数在数组的位置往前移,最后一个数加1。

if ((sum - N) == 1) {

for (int i = 0; i < count - 1; i++) {

A[i] = A[i + 1];

}

A[count - 2] = A[count - 1] + 1;

A[count - 1] = 0;

count--;

//如果sum比N大k,只需把2到i中等于k的那个数去掉,k后面在数组的位置往前移。

} else if ((sum - N) > 1) {

int temp = sum - N;

for (int i = 0; i <= count; i++) {

if (A[i] == temp) {

for (int j = i; j < count; j++) {

A[j] = A[j + 1];

}

A[count] = 0;

count--;

}

}

}

// 输出分解后的数,和最大积MAX.

double temp = 1;

System.out.println(N + "分解为" + count + "个不同的自然数:");

System.out.println();

System.out.print(N + "=");

for (int i = 0; i < count; i++) {

if (i < (count - 1)) {

System.out.print(A[i] + "+");

} else if (i == (count - 1)) {

System.out.println(A[i]);

}

}

System.out.println();

System.out.print("时,可得最大积MAX=");

for (int i = 0; i < count; i++) {

temp = temp * A[i];

if (i < (count - 1)) {

System.out.print(A[i] + "*");

} else if (i == (count - 1)) {

System.out.println(A[i]);

}

}

System.out.println();

System.out.println("MAX=" + temp);

}

public static void main(String[] args) {// 主函数定义一个对象,调用f()方法,实现贪心算法

Testsuanfa tsf = new Testsuanfa();

tsf.f();

}

}

(三)运行结果

相关文档
最新文档