IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 冲刺蓝桥杯 -- P1048 [NOIP2005 普及组] 采药 (java,01背包) -> 正文阅读

[数据结构与算法]冲刺蓝桥杯 -- P1048 [NOIP2005 普及组] 采药 (java,01背包)

题目来自 洛谷 采药
标签:记忆化搜索,动态规划,背包dp

题目描述

在这里插入图片描述

方法一 、记忆化搜索

思路

对于每个药材,都有选与不选两种选择,最直接的方法就是使用dfs暴搜每种情况,但是提交会超时,所以在此基础上进行改进。
定义一个二维数组memo,memo[i][j] 表示在时间 j 内采前 i 个药材的最大价值。
采用自定向下的方式进行搜索:
对于两种选择:
----选:当前药材的价值 + 前时间 j 内 i - 1个药材的最大价值
----不选: 前时间 j 内 i - 1个药材的最大价值
得到状态转移方程:memo[i][j] = max(memo[i - 1][j], memo[i - 1][j - cost[i]] + value[i])

将memo全部初始化为-1,当memo[i][j] 不等于-1时直接返回

代码

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

public class Main {

    static int[] cost = new int[105];
    static int[] value = new int[105];
    static int[][] memo = new int[105][1005];
    static int T, M;

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        T = scan.nextInt();
        M = scan.nextInt();
        for (int[] a : memo) {
            Arrays.fill(a, -1);
        }
        for (int i = 1; i <= M; i++) {
            cost[i] = scan.nextInt();
            value[i] = scan.nextInt();
        }
        int ans = dfs(M, T);
        System.out.println(ans);
    }

    private static int dfs(int m, int t) {
        if (m == 0 || t == 0) return memo[m][t] = 0;
        if (memo[m][t] != -1) return memo[m][t];
        int c1 = dfs(m - 1, t);
        int c2 = -Integer.MAX_VALUE;
        if (t >= cost[m]) c2 = value[m] + dfs(m - 1, t - cost[m]);
        memo[m][t] = Math.max(c1, c2);
        return memo[m][t];
    }
}

方法二、动态规划 (01背包)

思路

这道题算是01背包的模板题。
将时间看做背包容量,
将药材看做物品,
将药材采摘需要的时间看做物品重量,
将药材的价值看做物品价值,
最后直接套01背包模板

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt(), M = scan.nextInt();
        int[] cost = new int[M], value = new int[M];
        for (int i = 0; i < M; i++) {
            cost[i] = scan.nextInt();
            value[i] = scan.nextInt();
        }
        int[] dp = new int[T + 1];
        for (int i = 0; i < M; i++) {
            for (int j = T; j >= cost[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - cost[i]] + value[i]);
            }
        }
        System.out.println(dp[T]);
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:43:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:52:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码