CODEVS【3556】科技庄园
Life是codevs的用户,他是一个道德极高的用户,他积极贯彻党的十八大精神,积极走可持续发展道路,在他的不屑努力下STN终于决定让他在一片闲杂地里种桃,以亲身实践种田的乐趣,厉行节约,告诉人们节约的重要性!
春华秋实,在这个金秋的季节,Life带者他的宠物——PFT到了他的试验田,当他看见自己的辛勤成果时,心里是那个高兴啊!
这时Life对他的宠物PFT说:“你想不想吃桃啊?”
PFT兴奋的说:“好啊!”
Life说:“好吧,但是我只给你一定的时间,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”
PFT思考了一会,最终答应了!
由于PFT的数学不好!它并不知道怎样才能在规定的时间获得最大的价值,但你是一个好心人,如果你帮助它,你的RP一定会暴涨的!
对于这个可以RP暴涨机会,你一定不会错过的是不是?
由 于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,每棵桃树都可以摘 K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是 (1,1)}。
PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。
第一行:四个数为N,M,TI,A 分别表示试验田的长和宽,Life给PFT的时间,和PFT的体力。
下面一个N行M列的矩阵桃田。表示每次每棵桃树上能摘的桃数。
接下来N行M列的矩阵,表示每棵桃最多可以采摘的次数K。
一个数:PFT可以获得的最大的桃个数。
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
【样例解释】
可以摘到1次(1,1)或1次(2,3)或1次(3,3),体力和时间不满足再摘桃了。
【数据范围】
对于M N TI A
10<=30%<=50
10<=100%<=100
对于K
10<=100%<=100
保证结果在longint范围内
我们可以把问题转化为01背包,但注意到最后体力不能为0,不然WA大礼包等着你(雾)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //重点在转化为01背包 2 #include<iostream> 3 #include<cstdio> 4 #define maxn 100+5 5 using namespace std; 6 int a[maxn][maxn],k[maxn][maxn],w[10000001],v[10000001],dp[10000001]; 7 int main() 8 { 9 int n,m,t,sum=0,t1; 10 cin>>n>>m>>t>>t1; 11 t=t>(t1-1)?(t1-1):t; 12 for(int i=1;i<=n;++i) 13 for(int j=1;j<=m;++j) 14 scanf("%d",&a[i][j]); 15 for(int i=1;i<=n;++i) 16 for(int j=1;j<=m;++j) 17 scanf("%d",&k[i][j]); 18 for(int i=1;i<=n;++i) 19 for(int j=1;j<=m;++j) 20 { 21 if(k[i][j]) 22 { 23 int s1=a[i][j]; 24 int s2=i+j; 25 for(int p=1;p<=k[i][j];++p) sum++,w[sum]=s2*2,v[sum]=s1; 26 }//转化为01背包 27 } 28 for(int i=1;i<=sum;++i) 29 for(int j=t;j>=w[i];--j) 30 dp[j]=max(dp[j],dp[j-w[i]]+v[i]); 31 cout<<dp[t]; 32 return 0; 33 }