蓝桥杯 算法提高之最大乘积
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代码:
对于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); } }
相关文章推荐
- 蓝桥杯 算法提高 最大乘积
- 2016蓝桥杯算法提高——最大乘积
- 蓝桥杯 算法提高 最大乘积 【贪心】
- 蓝桥杯 算法提高之最大乘积
- 蓝桥杯 算法提高 最大乘积
- 蓝桥杯 算法提高 最大乘积(Java解题)
- 蓝桥杯算法提高 最大乘积
- 蓝桥杯 算法提高 最大乘积
- 蓝桥杯--算法提高 最大乘积(DFS)
- 蓝桥杯 ADV-15算法提高 最大乘积
- 蓝桥杯 算法提高 最大乘积
- 蓝桥杯_算法提高_最大乘积
- 蓝桥杯练习系统算法提高—最大乘积
- 蓝桥杯- 算法提高 最大乘积
- 蓝桥杯算法提高——最大乘积
- 蓝桥杯 ADV-15 算法提高 最大乘积
- 蓝桥杯 算法提高 求最大值
- 算法提高 最大乘积
- 蓝桥杯 ADV-80 算法提高 选最大数
- 蓝桥杯 算法提高 算法提高 最大乘积