2017年网易游戏的一道编程题,大致意思是满足组合攻击技能,必须是所选择时技能的和为m(m>0),且所选的这些技能的乘积最大:
分解后主解决两个问题:
其一:求数组中和为m的所有子数组;
其二:在满足一的条件下,求所有子数组的最大值;
主要考察的还是如何求数组中和为m的所有子数组:
如:数组[1,2,3,4,5,6],m=7时,满足条件的子数组有[1,2,4],[3,4],[2,5],[1,6];
主要使用回溯法解决该问题,思路以后补上:
import java.util.ArrayList; import java.util.Scanner; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ String array = scanner.nextLine(); int m = scanner.nextInt(); String[] strings = array.trim().split(" "); int len = strings.length; int[] num = new int[len]; for(int i=0;i<len;i++){ num[i] = Integer.parseInt(strings[i]); } int[] record = new int[len]; ArrayList<ArrayList<Integer>> lists =new ArrayList<ArrayList<Integer>>(); backtrack(num,record,m,0,0,lists); System.out.println(maxFighting(lists)); } } //求数组input中,和为给定key的所有子数组 public static void backtrack(int[] input,int[] record,int key, int sum,int n,ArrayList<ArrayList<Integer>> lists) { if(n == input.length){ return; }else{ for(int i=0; i<=1; i++){ sum += i*input[n]; record[n] = i; if(sum == key){ ArrayList<Integer> list = new ArrayList<Integer>(); for(int j=0; j<=n; j++){ if(record[j]==1){ list.add(input[j]); } } lists.add(list); } if(sum<key){ backtrack(input, record, key, sum, n+1,lists); } sum -= i*input[n]; } } } //求所有子数组中,最大乘积 public static int maxFighting(ArrayList<ArrayList<Integer>> lists){ int size = lists.size(); if(lists==null||size==0) return -1; int maxMultipy = Integer.MIN_VALUE; int multipy = 1; for(int i=0;i<size;i++){ ArrayList<Integer> list = lists.get(i); for(int j=0;j<list.size();j++){ multipy *=list.get(j); } if(multipy>maxMultipy){ maxMultipy = multipy; } multipy = 1; } return maxMultipy; } }
时间: 2024-10-12 20:48:07