您的位置:首页 > 其它

蓝桥杯 算法提高之最大乘积

2015-03-21 14:30 375 查看
问题描述

  对于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

思路:

由于数据要求较小。1<=n<=m<=15,所以直接暴力枚举所有组合数,然后求乘积。

dfs时选取组合数,不要每次都从头开始选,会有重复比如

5选3

1 2 3

1 2 4

1 2 5

1 3 4

1 3 5

1 4 5

2 3 4

2 3 5

3 4 5

不要选出1 3 2这样的数据。

AC代码:

import java.io.*;
import java.util.*;

public class Main{

static int ans =-Integer.MAX_VALUE;
public static void main(String[] args) {

Scanner cin = new Scanner(System.in);
int T = cin.nextInt();

while(T>0)
{
T--;
ans = -Integer.MAX_VALUE;
int n = cin.nextInt();
int m = cin.nextInt();
int[] arrN = new int
;
int[] arrM = new int[m];
boolean[] flag = new boolean
;
for(int i = 0;i<n;i++)
{
arrN[i] = cin.nextInt();
}

dfs(arrM,arrN,0,0,flag);

sop(ans);

}
}
public static void dfs(int[] arrM,int[] arrN,int mp,int np,boolean[] flag)
{

if(mp == arrM.length)
{
int tans = sum(arrM);
if(tans>ans)
ans = tans;
}
else
{
//搜索从np开始
for(int i = np;i<arrN.length;i++)
{
if(!flag[i])
{
arrM[mp] = arrN[i];
flag[i] = true;

dfs(arrM,arrN,mp+1,np+1,flag);
flag[i] = false;
}

}
}

}
public static int sum(int[] arrM)
{
int ans = 1;
for(int i = 0;i<arrM.length;i++)
{
ans *= arrM[i];
}
return ans;
}
public static void sop(Object obj)
{
System.out.println(obj);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: