POJ 1042 Gone Fishing (DP)

本文介绍了一个基于动态规划解决的捕鱼问题。通过定义状态转移方程,最大化在给定时间内的捕鱼数量。考虑到湖间的旅行时间,问题被简化并求解。

解题思路 (DP)

假如在给定时间h内,最远到达第个i湖时,最多捕鱼数为F(i, h), 那么问题的解为 

MAX{F(i, h)}, i=1...n

考虑最远到达第i个湖时,除去路途中的时间,最多的有效捕鱼时间为 hi = h - sum(t[0]+...+t[i-1]), 那么:
F(i, h) <=> maxfish(i, hi) 
且有
MAX{F(i, h)} = MAX{maxfish(i, hi)} = MAX{maxfish(1,h1), ..., maxfish(n,hn)}

这里maxfish(i, k)表述为原问题的简化形式:
不考虑湖之间的消耗时间(即t0=t1=...=t[i-1]=0),给定时间k内,在i个湖的最多捕鱼数。

建立递推关系,maxfish(i, k)取下列最大者:
{ k时间内在i-1个湖的最多捕鱼数; k时间内在第i个湖捕鱼时间大于0的所有情况的最多捕鱼数 }

maxfish(i, k) = MAX{ maxfish(i-1,k), lakefish(i,j)+maxfish(i-1,k-j) }, 1<j<=k 
lakefish(i,j)表示在第i个湖捕鱼j时间能捕到的总鱼数。

原问题MAX{maxfish(i, hi)},只需构造maxfish(n,hn)的解,maxfish(1,h1),...,maxfish(n-1,h[n-1])为过程中更小规模的子问题的解,这n个不同规模的子问题的解的最大者,即为原问题的解。

这个思路的关键在于,将问题简化为不考虑湖之间花费的时间,能更容易使用动态规划来求解。
注意点:
1. 计算过程中h时间转化为单位时间h=h*12, 求解完后输出时间均*5

2. 剩余时间放到第一个湖

代码

#include <iostream>
#include <memory.h>

using namespace std;

int f[26];
int d[26];
int t[25];

int lakefish[26][193];
int maxfish[26][193];  
int spent[26][193];  
int spentMax[26];

int main(int argc, char** argv)
{
  int cases = 0;
  int n, h;
  while (cin >> n)
  {
    if (n > 0 && cases > 0)
    {
      cout << endl;
    }

    if (n == 0) { break; }

    ++ cases;

    // input

    cin >> h;
    h = h * 12;
    for (int i = 1; i <= n; ++i)
    {
      cin >> f[i];
    }
    for (int i = 1; i <= n; ++i)
    {
      cin >> d[i];
    }
    for (int i = 1; i < n; ++i)
    {
      cin >> t[i];
    }

    // lakefish(i,j)

    memset(lakefish, 0, sizeof(lakefish));
    int fk = 0;
    for (int i = 1; i <= n; ++i)
    {
      for (int k = 1; k <= h; ++k)
      {
          fk = f[i] - d[i] * (k - 1);
          if (fk > 0)
          {
            lakefish[i][k] = lakefish[i][k-1] + fk;
          }
          else
          {
            lakefish[i][k] = lakefish[i][k-1];
          }
      }
    }

    // 1. maxfish(i, k) = MAX{ maxfish(i-1,k), lakefish(i,j)+maxfish(i-1,k-j)}, 1<j<=k 
    // 2. result = MAX{maxfish(1,h1), ..., maxfish(n,hn)}

    memset(maxfish, 0, sizeof(maxfish));
    memset(spent, 0, sizeof(spent));
    memset(spentMax, 0, sizeof(spentMax));

    int hi = h;
    int fishij = -1;
    int maxfishnk = -1, maxfishn = -1, maxfishh = -1;
    for (int i = 1; i <= n; ++i)
    {
        hi = hi - t[i-1]; 
        for (int k = 1; k <= hi; ++k)
        {
            maxfish[i][k] = maxfish[i-1][k];
            spent[i][k] = 0;
            for (int j = 1; j <= k; ++j)
            {
               fishij = lakefish[i][j] + maxfish[i-1][k-j];
               if (fishij > maxfish[i][k])
               {
                  maxfish[i][k] = fishij;
                  spent[i][k] = j;
               }
            }

            if (k == hi && maxfish[i][k] > maxfishnk)
            {
              maxfishnk = maxfish[i][k];
              maxfishn = i;
              maxfishh = k;
            }
        }
    }

    // output

    int i = maxfishn;
    int k = maxfishh;
    while (i > 0)
    {
      spentMax[i] = spent[i][k];
      k = k - spentMax[i];
      if (i == 1) { spentMax[i] += k; }
      -- i;
    }
    for (int i = 1; i <= n; ++i)
    {
      if (i > 1) { cout << ", "; }
      cout << spentMax[i]*5;
    }
    cout << endl << "Number of fish expected: " << maxfishnk <<endl;
  }

  return 0;
}


内容概要:本研究聚焦于绿电直连型电氢氨园区的优化运行,提出一种集成绿色电力直接供给、电解水制氢及氢气合成氨工艺的综合能源系统架构。通过建立包含风光发电、电解槽、氨合成反应器、储氢罐、电网交互及多类型负荷在内的系统模型,综合考虑绿电直供优先、能量梯级利用与多能互补原则,构建以系统综合运行成本最小化为目标的优化调度模型。研究采用Matlab与Python工具进行算法求解和仿真分析,利用实际气象与负荷数据完成案例验证,评估了不同运行策略下系统的经济性、可再生能源消纳能力与碳减排效益,为新型电氢氨一体化园区的规划与运行提供了理论依据和技术支撑。; 适合人群:具备一定电力系统、新能源或化工背景的研究生、科研人员及从事综合能源系统规划与优化工作的工程技术人员。; 使用场景及目标:①用于科研学习,理解电-氢-氨多能转换系统的建模与优化方法;②为工业园区的低碳化、智能化改造提供技术参考与决策支持;③作为开发类似综合能源管理系统的理论基础。; 阅读建议:此资源包含完整的模型代码、数据与论文,使用者应结合代码仔细研读论文中的模型构建部分,重点关注目标函数与约束条件的设计逻辑,并尝试修改参数进行仿真,以深入掌握优化算法在实际系统中的应用。
内容概要:本文深入探讨了RS485通信协议在芯片行业自动化测试系统中的实际开发与应用,涵盖其关键概念、电气特性、通信机制及与Modbus RTU协议的结合使用。文章重点介绍了差分信号完整性设计、主从时序控制、CRC校验与重传机制等核心技术要点,并通过一个基于Python的完整代码实例,展示了如何实现RS485主站对探针台、自动分选机等芯片测试设备的控制与数据采集。此外,还分析了RS485在晶圆探针台、ATE设备集群和环境监控等典型场景的应用,并展望了其与工业以太网融合、智能化诊断、高速化及AI集成的发展趋势。; 适合人群:具备一定嵌入式系统或工业通信基础,从事芯片测试、自动化设备开发及相关领域的研发人员,尤其是工作1-3年希望提升现场总线应用能力的工程师。; 使用场景及目标:①理解RS485在高干扰芯片测试环境中稳定通信的设计原理;②掌握Modbus RTU协议在Python下的实现方法,用于实际控制探针台、Handler等设备;③构建可靠的数据采集与设备控制系统,支持CRC校验、异常处理和日志追踪;④为后续向高速通信和智能诊断系统升级提供技术储备。; 阅读建议:此资源强调实战开发,建议结合硬件环境动手调试代码,重点关注线程锁、CRC计算、帧解析和超时控制等关键环节,在真实产线中验证通信稳定性,并利用日志系统进行故障分析与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值