贪心算法之最大乘积

来源:互联网 发布:王哲林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);     }}


原创粉丝点击