题目描述 注意注意:前方高能,有一大批桃树出没,在这月明星稀,秋高气爽的炎炎夏日,吃一 个美味的桃子是多么快乐(语文不好,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 范围内
解:这题是背包
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 */