zoukankan      html  css  js  c++  java
  • 采药(01背包)

    题目1123:采药

    点我

    题目描述:

    辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。
    为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。
    医师把他带到个到处都是草药的山洞里对他说:
    “孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。
    我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
    如果你是辰辰,你能完成这个任务吗?

    输入:

    输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。
    接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采摘某株草药的时间和这株草药的价值。

    输出:

    可能有多组测试数据,对于每组数据,
    输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。 

    样例输入:
    70 3
    71 100
    69 1
    1 2
    样例输出:
    3
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 int max(int x,int y)
     6 {
     7     return x>y?x:y;
     8 }
     9 int main()
    10 {
    11     int T,M;
    12     int val[102],tim[102];
    13     int f[102][1002];
    14     int i,j;
    15     while(cin>>T>>M)
    16     {
    17         memset(f,0,sizeof(f));
    18         for(i=1;i<=M;i++)
    19             cin>>tim[i]>>val[i];
    20         for(i=1;i<=M;i++)
    21             for(j=1;j<=T;j++)
    22             {
    23                 if(tim[i]<=j)
    24                     f[i][j]=max(f[i-1][j],f[i-1][j-tim[i]]+val[i]);
    25                 else
    26                     f[i][j]=f[i-1][j];
    27             }
    28         cout<<f[M][T]<<endl;
    29     }
    30 }
  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/a1225234/p/4693230.html
Copyright © 2011-2022 走看看