算法提高 最大乘积

题目

问题描述

  对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?

输入格式

  第一行一个数表示数据组数
  每组输入数据共2行:
  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。

输出格式

  每组数据输出1行,为最大的乘积。

样例输入

1
5 5
1 2 3 4 2

样例输出

48

思路:

有小伙伴用揹包做,可是蓝桥刷多了就习惯暴力了嘛~

代码

import java.util.*;
import java.math.*;
import java.util.regex.*;


public class Main {

    final static int INF = 0x3f3f3f3f;
    final static int NUM = 100;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int T=sc.nextInt();
        int n,m;
        int ans;
        while(T--!=0) {
            n=sc.nextInt();m=sc.nextInt();
            int[] a=new int[n];
            for(int i=0;i<n;i++)a[i]=sc.nextInt();
            Arrays.sort(a);

            if(m==1){System.out.println(a[a.length-1]);continue;}

            ans=1;
            for(int i=a.length-1,j=0;i>0&&j<a.length-1;) {
                if(m<=0)break;
                if(a[i]*a[i-1]>a[j]*a[j+1]) {
                    ans*=a[i];i--;
                    m--;
                }
                else {
                    if(m>=2) {
                        ans*=a[j]*a[j+1];j+=2;
                        m-=2;
                    }
                    else {
                        ans*=a[i];i++;
                        m--;
                    }
                }

            }

            System.out.println(ans);
        }

    }
}

点赞