zoukankan      html  css  js  c++  java
  • 【洛谷习题】疯狂的采药

    嗯,改编自那道经典的01背包问题——采药。

    题目链接:https://www.luogu.org/problemnew/show/P1616


    与之间的采药不同,这里每种草药有无限多个,通常把这类问题称为完全背包问题。

    每种草药并不唯一,会有若干个被放入背包,虽然看起来比01背包复杂很多,但实际上,他很容易转化为01背包问题。具体方法此处不再赘述,直接放一种简单有效的做法。在01背包代码中,优化空间复杂度后,我们是从T枚举到t[i],之所以要这样做,是为了保证,dp[j]里存放的是考虑i-1株草药时的最大价值。假如我们从t[i]枚举到T,会怎样呢?就会导致,dp[j]里存放的是考虑过无数株的第i株草药后的最大价值,刚好符合完全背包的要求。

     1 #include <cstdio>
     2 
     3 const int maxt = 1e5 + 5, maxm = 1e4 + 5;
     4 
     5 int t[maxm], v[maxm], dp[maxt];
     6 
     7 int main() {
     8     int T, m;
     9     scanf("%d%d", &T, &m);
    10     for (int i = 1; i <= m; ++i) {
    11         scanf("%d%d", &t[i], &v[i]);
    12         for (int j = t[i]; j <= T; ++j)
    13             if (dp[j] < dp[j - t[i]] + v[i])
    14                 dp[j] = dp[j - t[i]] + v[i];
    15     }
    16     printf("%d", dp[T]);
    17     return 0;
    18 }
    AC代码
  • 相关阅读:
    目录
    DRF的分页
    Django Rest Framework 视图和路由
    爬虫基本原理
    C# System.Threading.Timer的使用
    C# Task的使用
    C# 线程池的使用
    C# 异步委托回调函数使用
    C#异步委托等待句柄的使用
    C# 异步委托的使用
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/9595507.html
Copyright © 2011-2022 走看看