网易笔试(20210327)吉利数(子数组中数组和为6的倍数的最大子数组和)

三、求一个数组中子数组所有数之和最大,且为6的倍数的数组的最大和

(数字1-10000)

(数组长度0-100000)

输入:

[1 2 3 4 5 6]

6

输出:

18

import java.util.Scanner;

public class Wangyi_exam3 {
    /**
     * 最多一万个数的数组,找出其中子数组中和最大的子数组的和,且该和为6的整数倍
     * 输入 1 2 3 4 5 6 7
     *     7
      */

    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        String str1 = scanner.nextLine();
//        int n = Integer.parseInt(scanner.nextLine());
        String str1 = "5 5 5 5 4 2 7 7 7";
        int n = 9;
        String[] strs = str1.split(" ");

        int[] nums = new int[n];
        int sum = 0;
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(strs[i]);
            sum+=nums[i];
        }

        // 假设和的情况有n种,不超过1000万sum
        // dp[i] = 1表示和为i存在。 为0不存在。
        int[] dp = new int[n*10000];
        dp[0] = 1;
        dp[sum] = 1;
        for(int i=0; i<n; i++){
            // 单个的分数置为1
            dp[nums[i]] = 1;
            for(int j=0; j<=sum; j++){
                // 总和为j若是存在,用总和减去当前值的和也可以满足。例如:5 5 5 总和15,第一层循环dp[15]=1 dp[5]=1所以15-5>0,所以 dp[10]=1

                if(dp[j]==1 && j-nums[i]>=0){
                    dp[j-nums[i]] = 1;
                }
            }
        }
        for(int i=sum; i>=0; i--){
            if(dp[i]==1 && i>=6 && i%6==0){
                System.out.println(i);
                break;
            }
            if(i<6){
                System.out.println(0);
            }
        }

    }
}
原文地址:https://www.cnblogs.com/wsZzz1997/p/14588383.html