贪心算法之最大乘积

掌握贪心算法。

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

 

    }

}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值