当前位置: 首页 > news >正文

01背包完全背包学习记录

背包问题

  • 前言
  • 一、01背包
    • 1、花样滑冰
    • 2、二维递推
  • 二、完全背包
    • 1、花样滑冰(可选择相同动作)
    • 2、解
    • 3、完全平方数
    • 4、解
  • 总结
  • 参考文献

前言

背包问题是动态规划的一类,背包又分01背包 & 完全背包,各自有各自很鲜明的特点,虽同为背包,形式也很像,但是细节上很大不同。

一、01背包

01表示面对数组的每一个值(抽象),每个值只能取一次或者不取,此时的状态应该是二维的,不仅外层递推target,内层还需递推数组取当前值和不取当前值。

1、花样滑冰

一个运动员有energy的能量,可选择跳不同的动作actions[m][2],actions[i][0]表示第i个动作要消耗的能量,actions[i][1]表示第i个动作得到的分,要求不能做同样的动作,问:运动员能得到的最大分数是多少?

2、二维递推

/**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * <p>
     * 运动员可得到的最高分
     *
     * @param energy  int整型 运动员体力值
     * @param actions int整型二维数组 二维数组i为动作号 actions[i][0]为动作i+1消耗体力,actions[i][1]为动作i+1得分
     * @return int整型
     */
    public int maxScore(int energy, int[][] actions) {
        int n = actions.length;
        int[][] f = new int[energy + 1][n + 1];// 体力为i前j的最大得分。

        for (int i = 1; i <= energy; i++) {
            for (int j = 1; j <= n; j++) {
                f[i][j] = f[i][j - 1];
                if (actions[j - 1][0] <= i)
                    f[i][j] = Math.max(f[i][j], f[i - actions[j - 1][0]][j - 1] + actions[j - 1][1]);

            }
        }
        return f[energy][n];
    }

二、完全背包

完全表示面对数组的每一个值(抽象),每个值可以取多次,所以不存在当前值是否取或不取,虽也需要for循环寻找最值,但意义完全不一样。

1、花样滑冰(可选择相同动作)

如果能选择同样的动作,则问题变为完全背包问题。

2、解

// 动作可重复,完全背包。
    public int maxScore2(int energy, int[][] actions) {
        int n = actions.length;
        int[] f = new int[energy + 1];// 体力为i的最大得分。

        for (int i = 1; i <= energy; i++) {
            for (int j = 1; j <= n; j++) {
                if (actions[j - 1][0] <= i)
                    f[i] = Math.max(f[i], f[i - actions[j - 1][0]] + actions[j - 1][1]);

            }
        }
        return f[energy];
    }

3、完全平方数

在这里插入图片描述

4、解

public int numSquares(int n) {
        int[] f = new int[n + 1];

        for (int i = 1; i <= n; i++) {
            f[i] = Integer.MAX_VALUE;
            for (int j = 1; j * j <= i; j++) {
                f[i] = Math.min(f[i], f[i - j * j] + 1);
            }
        }
        return f[n];
    }

总:这两完全背包有一些细微的区别,就是数组是否有序问题,可以剪枝。

总结

1)如果能对问题进行分类,才算看到了区别和细节,才算入了门。

2)01背包特指只能装一个/不装,就必须进行二维递推,不仅要递推target,还要递推取不取当前+前n-1的状态应该是前面的最值。

3)完全背包指一种东西可以装很多次,此时直接递推target即可,里面套for循环寻找最值。

4)两种背包虽然同套for循环,但一种是二维递推,一种是面向整个数组寻找最值。

参考文献

[1] LeetCode 完全平方数

相关文章:

  • docker安装redis
  • java毕业设计的婚庆策划系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
  • Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(二)
  • java毕业设计的家居销售网站mybatis+源码+调试部署+系统+数据库+lw
  • 【Linux操作系统】——网络配置与SSH远程
  • 【C++】走进 ⌈ 类和对象 ⌋ 的核心 - 感受C++的精华 _ 剖析默认成员函数 | 构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载
  • 笔试强训(二)
  • Educational Codeforces Round 132 (Rated for Div. 2) A.B.D
  • MMDetection训练自己的数据集
  • 【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。
  • MyBatis-Plus--使用雪花算法生成主键ID--使用/分析
  • 开源 SPL 强化 MongoDB 计算
  • class09:ejs模块
  • C/C++ 网络库 boost asio 使用详解
  • 【JS】JavaScript入门笔记第四弹之函数、作用域~
  • 分享一款快速APP功能测试工具
  • .pyc 想到的一些问题
  • 【5+】跨webview多页面 触发事件(二)
  • 【Leetcode】104. 二叉树的最大深度
  • Angular 4.x 动态创建组件
  • CODING 缺陷管理功能正式开始公测
  • iOS 系统授权开发
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • mysql 数据库四种事务隔离级别
  • nfs客户端进程变D,延伸linux的lock
  • nginx 配置多 域名 + 多 https
  • nodejs:开发并发布一个nodejs包
  • passportjs 源码分析
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Vim Clutch | 面向脚踏板编程……
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 将 Measurements 和 Units 应用到物理学
  • 深度解析利用ES6进行Promise封装总结
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 使用权重正则化较少模型过拟合
  • 手写双向链表LinkedList的几个常用功能
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)EOS中账户、钱包和密钥的关系
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET框架设计—常被忽视的C#设计技巧
  • @RequestBody与@ModelAttribute
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [51nod1610]路径计数
  • [AIGC] Java 和 Kotlin 的区别
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C/C++]数据结构----顺序表的实现(增删查改)