摘桃子

我怕爱的太早我们不能终老 提交于 2019-11-28 16:08:40
题目描述
注意注意:前方高能,有一大批桃树出没,在这月明星稀,秋高气爽的炎炎夏日,吃一
个美味的桃子是多么快乐(语文不好,2333。。。)
由于大家都不是机器人,所以的体力并不是无限的,我们摘很多的桃以至体力为 0,而
白白把桃让给别的小伙伴,要留下体力守护好桃子。同时你每次只能摘一棵桃树(别太贪心
哦),每颗桃树都可以摘 K 次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发
点(你没有带红兜子,装不了那么多)即(0,0){试验田左上角的桃坐标是(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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!