zoukankan      html  css  js  c++  java
  • 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03

    【题目描述:】

    ... (宣传luogu2的内容被自动省略)

    洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望。

    Kkksc03的时间和金钱是有限的,所以他很难满足所有同学的愿望。所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望?

    【输入格式:】

    第一行,n M T,表示一共有n(n<=100)个愿望,kkksc03 的手上还剩M(M<=200)元,他的暑假有T(T<=200)分钟时间。

    第2~n+1行 mi,ti 表示第i个愿望所需要的时间和金钱。

    【输出格式:】

    一行,一个数,表示kkksc03最多可以实现愿望的个数。

    [算法分析:]

    乍一看题目,诶?怎么这么像01背包?

    啊!好像就是01背包,只不过同时有了两个限制条件.

    这样DP方程就很容易得出了:

      f[j][k] = max(f[j][k], f[j - m[i]][k - t[i]] + 1)

      1≤i≤n,  m[i]≤j≤M,  t[i]≤k≤T

    [Code:]

     1 //榨取kkksc03
     2 #include<iostream>
     3 #include<cstdio>
     4 using namespace std;
     5 
     6 const int MAXN = 100 + 1;
     7 const int MAXM = 200 + 1;
     8 
     9 int n, M, T;
    10 int m[MAXN], t[MAXN];
    11 int f[MAXM][MAXM];
    12 
    13 int main() {
    14     scanf("%d%d%d", &n, &M, &T);
    15     for(int i=1; i<=n; ++i)
    16         scanf("%d%d", &m[i], &t[i]);
    17     for(int i=1; i<=n; ++i)
    18         for(int j=M; j>=m[i]; --j)
    19             for(int k=T; k>=t[i]; --k) {
    20                 f[j][k] = max(f[j][k], f[j - m[i]][k - t[i]] + 1);
    21             }
    22     printf("%d
    ", f[M][T]);
    23 }
  • 相关阅读:
    Spring HTTP Service
    Nexus搭建Maven私服
    虚拟机Class文件结构笔记
    JVM内存区域与内存溢出异常
    深入学习虚拟机类加载过程
    虚拟机常用的内存查看与分析工具
    对Java内存模型即JMM的理解
    通过Redux源码学习基础概念一:简单例子入门
    跟着官网的例子学Reacjs (一)FilterableProductTable
    es6继承 vs js原生继承(es5)
  • 原文地址:https://www.cnblogs.com/devilk-sjj/p/9066184.html
Copyright © 2011-2022 走看看