网易互联网8.8笔试 第三题 背包问题 回溯

题目:
在这里插入图片描述
思路:
简单思考后可以想到一个回溯的做法
考虑每个物品是给第一个人还是第二个人还是丢掉
答案的最差解是所有物品都丢弃
看到代码后会觉得竟如此简单
时间复杂度O(T × 3^n)
代码:

public class Main {
    /**
     * one 给第一个人
     * two 给第二个人
     * res 结果,一开始为全部的和,因为最差的解就是所有都丢弃
     * left 剩下的物品价值
     */
    static int one, two, res, left;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            int m = sc.nextInt();
            int[] data = new int[m];
            one = 0;
            two = 0;
            res = 0;
            left = 0;
            for (int j = 0; j < m; j++) {
                data[j] = sc.nextInt();
                res += data[j];
            }
            process(data, 0);
            System.out.println(res);
        }
    }

    public static void process(int[] data, int currentIndex){
        int len = data.length;
        if (currentIndex == len){
            if (one == two){
                res = Math.min(res, left);
            }
            return;
        }
        one += data[currentIndex];
        process(data, currentIndex+1);
        one -= data[currentIndex];

        two += data[currentIndex];
        process(data, currentIndex+1);
        two -= data[currentIndex];

        left += data[currentIndex];
        process(data, currentIndex+1);
        left -= data[currentIndex];
    }
}

leetcode上有几乎原题,不过是求反向答案
题目链接
其中的一个题解
用的动态规划可以同样求本笔试题,时间复杂度O(n^2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值