其他分享
首页 > 其他分享> > 记录一道面试题

记录一道面试题

作者:互联网

题目

有一个背包,体积是v,有一些物品,占用的体积是w,每个物品可以无限拿,问多少种办法可以把背包恰好状态。

解题

设:dp[i][v] = dp[i-1][v] + dp[i][v-w[i]]
前i个物品,恰好装满体积v的方法有俩个来源。前i-1个物品恰好装满v和 前i个物品恰好装满 v-w[i]
dp[i][v-w[i]] 可能不好理解,举个例子,当前体积是5,第二个物品占用的体积是2,装第二个物品时,前俩个物品恰好装满体积3时,在放入一个第二个物品也是可以装满体积5的。
代码如下:
需要先枚举体积:


public class Main {
    static int[][] dp = new int[5000][5000];

    public static void main(String[] args) throws Exception {
        //int[] num = {0, 1, 2, 3, 4, 5};
        int[] num = {0,  2, 3, 4, 5};
        int total = 5;
        init();

        for (int v = 1; v <= total; ++v) {
            for (int i = 1; i < num.length; ++i) {
                if (v < num[i]) {
                    dp[i][v] = dp[i - 1][v];
                    continue;
                }
                dp[i][v] = dp[i - 1][v] + dp[i][v - num[i]];
            }
        }
        System.out.println(dp[num.length - 1][total]);
    }

    private static void init() {
        for (int i = 0; i < 5000; i++) {
            dp[i][0] = 1;
        }
    }
}

标签:面试题,记录,int,装满,恰好,一道,体积,物品,dp
来源: https://www.cnblogs.com/shuiyonglewodezzzzz/p/14249654.html