• OpenJudge 2773 2726 2727 采药


    1.链接地址:

    http://bailian.openjudge.cn/practice/2773/

    http://bailian.openjudge.cn/practice/2726/

    http://bailian.openjudge.cn/practice/2727/

    2.题目:

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

    如果你是辰辰,你能完成这个任务吗?
    Input
    输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采 摘某株草药的时间和这株草药的价值。
    Output
    输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
    Sample Input
    70 3
    71 100
    69 1
    1 2
    
    Sample Output
    3
    Source
    NOIP 2005

    3.思路:

    背包问题,dp模板题

    由于规模小,直接使用未优化的背包问题解法即可

    4.题目:

    提供两个版本的答案

    (1)未优化数组的,比较容易看懂

     1 #include <iostream>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     //freopen("C://input.txt","r",stdin);
     9 
    10     int i,j;
    11 
    12     int t,m;
    13     cin >> t >> m;
    14 
    15     int *arr_time = new int[m];
    16     int *arr_value = new int[m];
    17 
    18     for(i = 0;i < m; ++i) cin >> arr_time[i] >> arr_value[i];
    19 
    20     int **dp = new int*[m];
    21     for(i = 0;i < m; ++i) dp[i] = new int[t + 1];
    22 
    23     for(i = 0; i < arr_time[m - 1] && i <= t; ++i) dp[m - 1][i] = 0;
    24     for(i = arr_time[m - 1]; i <= t; ++i) dp[m - 1][i] = arr_value[m - 1];
    25 
    26     for(i = m - 1 - 1; i >= 0; --i)
    27     {
    28         for(j = 0; j < arr_time[i] && j <= t; ++j) dp[i][j] = dp[i + 1][j];
    29         for(j = arr_time[i]; j <= t; ++j) dp[i][j] = dp[i + 1][j] > (dp[i + 1][j - arr_time[i]] + arr_value[i]) ? dp[i + 1][j] : (dp[i + 1][j - arr_time[i]] + arr_value[i]);
    30     }
    31 
    32     int max = 0;
    33     for(j = 0; j <= t; ++j) if(max < dp[0][j]) max = dp[0][j];
    34     
    35     cout << max << endl;
    36 
    37     for(i = 0; i < m; ++i) delete [] dp[i];
    38     delete [] dp;
    39 
    40     delete [] arr_time;
    41     delete [] arr_value;
    42 
    43     return 0;
    44 }

    (2)优化数组的

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     //freopen("C://input.txt","r",stdin);
    10 
    11     int i,j;
    12 
    13     int t,m;
    14     cin >> t >> m;
    15 
    16     int *arr_time = new int[m];
    17     int *arr_value = new int[m];
    18 
    19     for(i = 0;i < m; ++i) cin >> arr_time[i] >> arr_value[i];
    20 
    21     int *dp = new int[t + 1];
    22     memset(dp,0,sizeof(int) * (t + 1));
    23 
    24     for(i = m - 1; i >= 0; --i)
    25     {
    26         for(j = t; j >= arr_time[i]; --j) dp[j] = dp[j] > (dp[j - arr_time[i]] + arr_value[i]) ? dp[j] : (dp[j - arr_time[i]] + arr_value[i]);
    27     }
    28 
    29     int max = 0;
    30     for(j = 0; j <= t; ++j) if(max < dp[j]) max = dp[j];
    31     
    32     cout << max << endl;
    33 
    34     delete [] dp;
    35 
    36     delete [] arr_time;
    37     delete [] arr_value;
    38 
    39     return 0;
    40 }
  • 相关阅读:
    spring-boot-route(七)整合jdbcTemplate操作数据库
    spring-boot-route(六)整合JApiDocs生成接口文档
    spring-boot-route(五)整合Swagger生成接口文档
    spring-boot-route(四)全局异常处理
    spring-boot-route(三)实现多文件上传
    spring-boot-route(二)读取配置文件的几种方式
    spring-boot-route(一)Controller接收参数的几种方式
    国庆,要干几件大事
    栈与队列简介
    一文了解Zookeeper
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3584517.html
Copyright © 2020-2023  润新知