三、求一个数组中子数组所有数之和最大,且为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); } } } }