import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weights int整型一维数组 * @param totalWeight int整型 * @return int整型 */ public int minEatTimes(int[] weights, int totalWeight) { Integer[] arr = new Integer[weights.length]; for (int i = 0; i < arr.length; i++) { arr[i] = weights[i]; } Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); int[][] dp = new int[arr.length + 1][totalWeight + 1]; boolean[][] visited = new boolean[arr.length + 1][totalWeight + 1]; for (int i = 0; i < dp.length; i++) { for (int j = 0; j <= totalWeight; j++) { dp[i][j] = Integer.MAX_VALUE; } } dp[0][0] = 0; visited[0][0] = true; for (int i = 1; i < dp.length; i++) { for (int j = 0; j <= totalWeight; j++) { visited[i][j] = visited[i - 1][j]; dp[i][j] = dp[i - 1][j]; for (int k = 1; arr[i - 1] * k <= j; k++) { visited[i][j] = (visited[i - 1][j - arr[i - 1] * k] || visited[i - 1][j]); if (visited[i][j] != visited[i - 1][j]) { dp[i][j] = Math.min(dp[i - 1][j - k * arr[i - 1]] + k, dp[i][j]); } } } } return dp[dp.length-1][totalWeight]==Integer.MAX_VALUE?-1:dp[dp.length-1][totalWeight]; } }
本题考察的知识点是动态规划,我们定义了两个二维数组,一个布尔数组,一个整形数组。布尔数组visited[i][j]用来表示前i个物品是否能够选出总重量为j的若干物品,整形数组dp[i][j]用来表示构成总重量为j在前i类物品中需要选择的最小数目是多少。初始化dp[0][0]=0,其他数为整形最大值,visited[0][0]为true,其余为false,然后开始进行状态转移.