华为2021秋招0902笔试——第三题背包问题

tech2022-09-10  113

题目描述 你在一家家具公司工作,需要将家具发往全国各地,为此,你需要将箱子装上卡车,每个箱子的尺寸和价值各不相同,你需要尽可能利用每辆卡车的空间,假设卡车空间大小为K,给定个数组W,它的第i个元素表示第i个箱子的尺寸,给定一个数组V,它的第i个元素表示第i个箱子的价值,为此,你将如何选择要装上卡车的箱子在满足卡车的空间占用最大前提下,使卡车运输的箱子总价值最大?

输入描述: 参数1:卡车空间K(1<K< 1000) 参数2:箱子个数N(1<N<1000) 参数3:每个箱子尺寸w(1<w<1000) 参数4:每个箱子价值v(1<v<1000)

输出描述: 在满足卡车的空间占用最太前提下,使卡车运输的箱子总价值最大?输出卡车运输的箱子最大的总价值。 示例1 输入 9 5 2 2 4 6 3 3 4 8 9 6 输出 18

当时看到这个题目,以为是背包问题,直接上代码,但是只过了81%,希望网友帮忙分析一下,找到原因。

import java.util.Scanner; public class Third { /** * * @param w 每个箱子尺寸w * @param v 每个箱子价值v * @param K 卡车空间K * @return */ public static int knapSack(int[] w, int[] v, int K) { int size = w.length; if (size == 0) { return 0; } int[][] dp = new int[size][K + 1]; //初始化第一行 //仅考虑容量为K的背包放第0个物品的情况 for (int i = 0; i <= K; i++) { dp[0][i] = w[0] <= i ? v[0] : 0; } //填充其他行和列 for (int i = 1; i < size; i++) { for (int j = 0; j <= K; j++) { dp[i][j] = dp[i - 1][j]; if (w[i] <= j) { dp[i][j] = Math.max(dp[i][j], v[i] + dp[i - 1][j - w[i]]); } } } return dp[size - 1][K]; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int K = sc.nextInt();//卡车空间 int N = sc.nextInt();//箱子个数 int[] w = new int[N];//每个箱子的尺寸 int[] v = new int[N];//每个箱子的价值 for (int i = 0; i < w.length; i++) { w[i] = sc.nextInt(); } for (int i = 0; i < v.length; i++) { v[i] = sc.nextInt(); } System.out.println(knapSack(w, v, K)); } }

注:本代码仅通过81%用例。

最新回复(0)