博客
关于我
ALGO-30 算法训练 入学考试
阅读量:729 次
发布时间:2019-03-21

本文共 812 字,大约阅读时间需要 2 分钟。

为了解决这个问题,我们需要使用动态规划来解决一个典型的0-1背包问题。我们需要在给定的时间内选择草药,使其总价值最大化。

方法思路

  • 问题分析:这个问题类似于0-1背包问题,其中每个物品只能被选择一次,且不能超过总时间限制。
  • 动态规划状态定义:我们定义dp[j]表示在时间j内能够获得的最大价值。
  • 状态转移方程
    • 如果当前草药的采集时间超过剩余时间,直接舍弃该草药。
    • 如果当前草药的采集时间在剩余时间内,选择采集或不采集,取最大值。
  • 优化考虑:使用一维数组来优化空间复杂度,通过逆序遍历时间进行处理。
  • 解决代码

    #include 
    using namespace std;int main() { int T, M; // 读取输入 cin >> T >> M; // 一维数组初始化 int dp[T + 1] = {0}; for (int i = 0; i < M; ++i) { int a, b; cin >> a >> b; for (int j = T; j >= a; --j) { dp[j] = max(dp[j], dp[j - a] + b); } } cout << dp[T] << endl; return 0;}

    代码解释

    • 输入读取:读取总时间T和草药数量M,然后逐行读取每株草药的采集时间和价值。
    • 动态规划数组初始化:使用一维数组dp,初始化为0,表示不选择任何草药时的价值。
    • 处理每株草药:对每株草药,逆序遍历时间,更新可能的最大价值。对于每个时间j,如果草药的采集时间小于等于j,则更新dp[j]为最大价值。
    • 输出结果:最终输出在总时间内的最大价值。

    这种方法确保了我们在给定的时间内选择了最优的草药组合,实现了动态规划的时间和空间优化。

    转载地址:http://grdgz.baihongyu.com/

    你可能感兴趣的文章
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    MySQL 错误
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>