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 }
  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/devilk-sjj/p/9066184.html
Copyright © 2011-2022 走看看