经典背包系列问题

本文介绍了经典背包系列问题,包括问题一和问题二。详细阐述了暴力递归方法及如何通过缓存法和动态规划进行优化,实现从超时到可AC的状态。并给出了不同优化阶段的代码示例。
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

经典背包系列问题

作者:Grey

原文地址:

博客园:经典背包系列问题

CSDN:经典背包系列问题

问题一

题目描述

在 n 个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为Ai (每个物品只能选择一次且物品大小均为正整数)

题目链接:LintCode 92 · Backpack

暴力递归方法思路

定义递归函数

int p(int rest, int i, int[] arr)

递归含义表示:从 i 开始到最后,还剩下 rest 容量的情况下,得到的最大值是多少。

递归函数中有两个决策,第一个决策,不要当前位置物品


int p1 = p(rest, i+1, arr);

第二个决策,要当前物品,这个决策下,有一个限制条件,即当前物品大小不超过 rest,

arr[i] + p(rest - arr[i], i + 1, arr)

暴力解法的完整代码如下

public class Solution {

    public static int backPack(int m, int[] arr) {
        if (arr == null || arr.length < 1) {
            return 0;
        }
        return p(m, 0, arr);
    }

    public static int p(int i, int j, int[] arr) {
        if (j == arr.length) {
            return 0;
        }
        int p1 = p(i, j + 1, arr);
        return i >= arr[j] ? Math.max(arr[j] + p(i - arr[j], j + 1, arr), p1) : p1;
    }
}

超时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3N7K1QV-1667408903069)(https://img2022.cnblogs.com/blog/683

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值