划分权重(01背包利用)纯暴力解决填空
这个题直接用暴力,看能填满多大的体积,比较求出最大值,其实也可以看部分,越靠近中间越大,可以推导出来,结果是一个二次函数,最大值在中间。
package com.js.datastructure.recursion.蓝桥.国特训练营;import java.util.Scanner;public class 划分权重 {static int [] num = {5160 ,9191, 6410, 4657, 7492, 1531, 8854, 1253, 4520, 9231,1266 ,4801 ,3484 ,4323 ,5070 ,1789 ,2744 ,5959 ,9426 ,4433,4404, 5291, 2470, 8533 ,7608, 2935, 8922, 5273, 8364, 8819,7374 ,8077 ,5336 ,8495 ,5602 ,6553 ,3548 ,5267 ,9150 ,3309};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int sum = 0;for (int i = 0; i < 40; i++) {sum = sum + num[i];}boolean[] dp = new boolean[sum + 1];dp[0] = true;for (int i = 0; i < 40; i++) {for (int j = sum - num[i]; j >= 0 ; j--) {if(dp[j]){dp[j + num[i]] = true;}}}long max = 0;for (int i = 0; i < sum + 1; i++) {if(dp[i]){max = Math.max(max,(long)i * (sum - i));}}System.out.println(max);}
}