算法提高 最大乘积

问题描述
  对于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 

思路:

这道题 刚开始,我只根据题目输入考虑了正数,而没有考虑负数。后来提交错误后重新考虑。

这道题先排序比较好做,因为那样最大的正数就会在数组的右边,而最小的负数就会在数组的左边,再比较数组最左边的两个数的乘积是否大于数组最右边的两个数的乘积,如果大于 则用这两个负数,相应的要取的数的个数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]);
		}

	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值