贪心算法之最大乘积
来源:互联网 发布:王哲林cba数据 编辑:程序博客网 时间:2024/05/19 22:48
掌握贪心算法。设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然 数的乘积最大。 对于给定的正整数n,编程计算最优分解方案。 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner; publicclass Greed { privatestaticintk; /* * 设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。对于给定的正整数n,编程计算最优分解方案。 */ //int N = 30; int[] a = newint[100]; intN = this.getN(); publicstaticvoid main(String[] args) { Greed d = new Greed(); d.greed(); } privateint getN() { System.out.println("请输入一个正整数: "); Scanner scan = new Scanner(System.in); int a =scan.nextInt(); return a; //贪心算法 publicvoid greed() { int count = 0; // 自然数分解次数初始化为0 int sum = 0; //从2依次开始累计求和 for (int i = 2; sum < N; i++) { sum = i + sum; a[i - 2] = i; count++; //System.out.println("i="+i+" "+"sum="+sum+" "+"a"+(i-2)+""+a[i]+" "+count); } //当sum-N==1时 if (sum - N == 1) { for (int i = 0; i < count; i++) { a[i] = a[i + 1]; // 第一个数撤销,其他均向前递进 } a[count - 2] = a[count - 1] + 1; //最后一个数加上1 a[count - 1] = 0; //该数组的最后一个位置为0 } elseif (sum - N > 1) { int tmp = sum - N; for (int i = 0; i < count; i++) { if (a[i] == tmp) { //该数组某个位置的值==tmp时,撤销该值,其后索引均向前递进 for (int j = i; j < count; j++) { a[j] = a[j + 1]; } a[count - 1] = 0; count--; } } } int tmp = 1; System.out.println(" " + count + "个自然数"); System.out.print(N + "="); for (int i = 0; i < count; i++) { if (i < (count - 1)) { System.out.print(a[i] + "+"); } if (i == (count - 1)) { System.out.println(a[i]); } } System.out.print("max="); for (int i = 0; i < count; i++) { tmp = tmp * a[i]; //累计求和 if (i < (count - 1)) { System.out.print(a[i] + "*"); } if (i == (count - 1)) { System.out.println(a[i]); } } System.out.println(tmp); }}