• 摘桃子


    题目描述
    注意注意:前方高能,有一大批桃树出没,在这月明星稀,秋高气爽的炎炎夏日,吃一
    个美味的桃子是多么快乐(语文不好,2333。。。)
    由于大家都不是机器人,所以的体力并不是无限的,我们摘很多的桃以至体力为 0,而
    白白把桃让给别的小伙伴,要留下体力守护好桃子。同时你每次只能摘一棵桃树(别太贪心
    哦),每颗桃树都可以摘 K 次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发
    点(你没有带红兜子,装不了那么多)即(00){试验田左上角的桃坐标是(1,1)}
    你每秒只能移动一个单位,每移动一个单位耗费体力 1(摘取不花费时间和体力,但只
    限上下左右移动)。然(lan)后,你最多能摘多少个桃子呢,快去算一算吧。。。
    输入格式
    共 2N+1 行
    第一行共四个数,为 N,M,T,A 分别表示试验田的长和宽,你有的的时间,和你的体力。
    下面一个 N 行 M 列的矩阵桃田。表示每次每棵桃树上能摘的桃数。
    接下来 N 行 M 列的矩阵,表示每棵桃最多可以采摘的次数 K。
    输出格式
    一个数:你可以获得的最多的桃个数。
    样例输入
    4 4 13 20
    10 0 0 0
    0 0 10 0
    0 0 10 0
    0 0 0 0
    1 0 0 0
    0 0 2 0
    0 0 4 0
    0 0 0 0
    样例输出
    10
    数据规模和约定
    对于 M,N,T,A
    10<=30%<=50
    10<=100%<=100
    对于 K
    10<=100%<=100
    保证结果在 longint 范围内
    View Code

    解:这题是背包

    1)看数据范围,很小

    2)题目中有说每次摘完桃子之后都要再回去,也就是说

    对于每个位置的桃子,采摘他花费的体力和得到的价值都是固定的

    并且T=min(体力,时间)也是固定的

    综上,我们可以用01背包来写

    --坑点:

    注意题目中的一句话

    由于大家都不是机器人,所以的体力并不是无限的,我们摘很多的桃以至体力为 0,而白白把桃让给别的小伙伴,要留下体力守护好桃子

    说明如果体力<时间的话,要留下至少一个体力

    即T=min(体力-1,时间)

     1 #include<algorithm>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<iostream>
     5 using namespace std;
     6 const int N=1e7;
     7 int n,m,t1,t2,t;
     8 int f[N],tt[N],cc[N];
     9 int a[200][200],zz;
    10 int main()
    11 {
    12     freopen("t1.in","r",stdin);
    13     freopen("t1.out","w",stdout); 
    14     scanf("%d%d%d%d",&n,&m,&t1,&t2);
    15     t=min(t1,t2-1);
    16     for(int i=1;i<=n;++i)
    17      for(int j=1;j<=m;++j)
    18       scanf("%d",&a[i][j]);
    19     for(int i=1,x;i<=n;++i)
    20      for(int j=1;j<=m;++j)
    21      {
    22          scanf("%d",&x);
    23          if(x && a[i][j])
    24           for(int k=1;k<=x;++k) 
    25           {
    26              zz++;
    27             tt[zz]=i*2+j*2;
    28             cc[zz]=a[i][j];    
    29           }
    30      }
    31     for(int i=1;i<=zz;++i)
    32      for(int j=t;j>=tt[i];--j)
    33       f[j]=max(f[j],f[j-tt[i]]+cc[i]);
    34     printf("%d",f[t]);
    35     return 0;
    36 } /*
    37 4 4 13 20
    38 10 0 0 0
    39 0 0 10 0
    40 0 0 10 0
    41 0 0 0 0
    42 1 0 0 0
    43 0 0 2 0
    44 0 0 4 0
    45 0 0 0 0
    46 
    47 10
    48 */
    View Code
  • 相关阅读:
    【LeetCode】147. Insertion Sort List
    【LeetCode】64. Minimum Path Sum
    【LeetCode】7. Reverse Integer
    【LeetCode】107. Binary Tree Level Order Traversal II (2 solutions)
    【LeetCode】114. Distinct Subsequences
    【LeetCode】35. Search Insert Position (2 solutions)
    为什么easyui的datagrid里getSelections还有getChecked只能获取一行值呢?
    IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
    修改easyui的easyloader的默认css目录路径
    如何在Visual Studio的查找功能中使用正则表达式?
  • 原文地址:https://www.cnblogs.com/adelalove/p/9184497.html
Copyright © 2020-2023  润新知