贪心算法之最大乘积

掌握贪心算法。

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

 

    }

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