问题描述
对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入格式
第一行一个数表示数据组数
每组输入数据共2行:
第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
每组输入数据共2行:
第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
5 5
1 2 3 4 2
样例输出
48
思路:
这道题 刚开始,我只根据题目输入考虑了正数,而没有考虑负数。后来提交错误后重新考虑。
这道题先排序比较好做,因为那样最大的正数就会在数组的右边,而最小的负数就会在数组的左边,再比较数组最左边的两个数的乘积是否大于数组最右边的两个数的乘积,如果大于 则用这两个负数,相应的要取的数的个数m的数也减少2。如果小于 则用正数进行乘法运算。
注意:每次使用数字之后需要把数字变成0,再排序,为了防止再次取出这个数字。
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int[] n = new int[a];// 数据
int[] m = new int[a];// 要运算的数据个数
int[] sum = new int[a];
for (int i = 0; i < a; i++) {// 乘法 给初始值赋值为1
sum[i] = 1;
}
for (int i = 0; i < a; i++) {
n[i] = sc.nextInt();
m[i] = sc.nextInt();
int[] b = new int[n[i]];
for (int j = 0; j < n[i]; j++) {
b[j] = sc.nextInt();
}
Arrays.sort(b);//排序
for (int k = 0; k < m[i]; ) {
if(n[i]>1&&max<=Math.abs(b[0])&&b[0]<0){//只有数据是两组及其以上的时候才能进入
if(b[0]*b[1]>b[b.length-1]*b[b.length-2]){
sum[i] *= b[0]*b[1];
k += 2;//复数每次相乘必须是乘两个
b[0] = 0;
b[1] = 0;
}else {//正数乘一个
sum[i] *= b[b.length-1];
b[b.length-1] = 0;
k++;
}
}else {
sum[i] *= b[b.length-1];
b[b.length-1] = 0;
k++;
}
Arrays.sort(b);//处理一次排序一次
}
System.out.println(sum[i]);
}
}
}