贪心算法程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();
}
}
(三)运行结果