0803阿里8月3日笔试思路,求牛牛们贡献测试用例

import java.util.Arrays;
import java.util.Scanner;

/** 题目大概是:有几个人,给出每个人的拥有的钱。
    现在给出几个要出售的房子,两个变量,一个是价格,一个是舒服程度。求最大舒服度总和的购买方案
    要求:一个房子最多只能被一个买
 * 多个背包 + 0-1背包
 * money        数组:每个背包容量
 * a            每个物品的重量
 * b            每个物品的价值
 * n            背包的总数
 * m            物品的总数
 */
public class Test3 {
    static boolean[] visited;
    static int[][][] dp;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] money = new int[n];
        for (int i = 0; i < n; i++) {
            money[i] = sc.nextInt();
        }
        int[] a = new int[m + 1];
        int[] b = new int[m + 1];
        for (int i = 1; i <= m; i++) {//让第一件物品对应的索引为1
            a[i] = sc.nextInt();
            b[i] = sc.nextInt();
        }
        System.out.println(Arrays.toString(a));
        System.out.println(maxB(money, a, b));
        //System.out.println(Arrays.toString(visited));
    }

    private static int maxB(int[] peo, int[] w, int[] v) {
        int n = peo.length;
        dp = new int[n][][];
        visited = new boolean[w.length];

        int k = 0;
        while (k < n) {
            dp[k] = new int[w.length][peo[k] + 1];

            for (int i = 1; i < w.length; i++) {
                if (!visited[i]) {
                    for (int j = 1; j <= peo[k]; j++) {
                        if (j >= w[i]) {
                            dp[k][i][j] = Math.max(dp[k][i - 1][j], v[i] + dp[k][i - 1][j - w[i]]);
                        } else {
                            dp[k][i][j] = dp[k][i - 1][j];
                        }
                    }
                } else {
                    dp[k][i] = dp[k][i - 1];//即使该物品被买了,也要更新dp表中的这一行
                }
            }
            findTrace(w.length-1, peo[k], w, v, dp[k]);//从dp表右下角开始回溯
            k++;
        }
        int res = 0;
        for (int i1 = 0; i1 < n; i1++) {
            res += dp[i1][w.length - 1][peo[i1]];
        }
        return res;
    }

    static void findTrace(int x, int y, int[] w, int[] v, int[][] arr) {
        if (x == 0) {
            System.out.println(Arrays.toString(visited));
            return;
        }

        if (arr[x][y] == arr[x - 1][y]) {
            if(!visited[x])//如果该位置未被回溯过,才将这个位置置为false,避免在上一轮回溯为true重新被赋值
                visited[x] = false;
            findTrace(x - 1, y, w, v, arr);
        } else if (arr[x][y] == arr[x - 1][y - w[x]] + v[x]) {
            visited[x] = true;
            findTrace(x - 1, y - w[x], w, v, arr);
        }

    }
}

#阿里笔试##笔试题目##阿里巴巴#
全部评论
2 2 2 2 2 2 2 2 out:4 官方给的通过了
1 回复 分享
发布于 2020-08-04 11:10
请问有每个人最多买一套的限制吗?我在另一个帖子看到有这个限制,但加上这个题目就变得简单了很多吧
点赞 回复 分享
发布于 2020-08-05 19:06
5 6 5  3  2  10  7    9 8 9 3 7 6 4 7 1 7 8 1 试试
点赞 回复 分享
发布于 2020-08-05 09:42

相关推荐

04-05 21:13
邯郸学院 Java
点赞 评论 收藏
分享
挣K存W养DOG:我记得好多人说这个公司就是白嫖方案的,现在有大体方案要让你给他展示实现细节了,也是无敌了
点赞 评论 收藏
分享
评论
2
14
分享

创作者周榜

更多
牛客网
牛客企业服务