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

题目描述
你在一家家具公司工作,需要将家具发往全国各地,为此,你需要将箱子装上卡车,每个箱子的尺寸和价值各不相同,你需要尽可能利用每辆卡车的空间,假设卡车空间大小为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%用例。

猜你喜欢

转载自blog.csdn.net/weixin_43419256/article/details/108374997