bestcoders Happy Birthday
Happy birthday
今天是Gorwin的生日。所以她的妈妈要实现她的一个愿望。Gorwin说她想吃很多蛋糕。所以他妈妈带她来到了蛋糕园。
这个园子被分成了n*m个方格子。在每一个格子里面,有一个蛋糕。第i行,第j列的格子中有一个重量为wij 千克的蛋糕,Gorwin从左上角(1,1)的格子开始走,走到右下角(n,m)的格子。在每一步中,Gorwin可以向右或者向下走,即是:Gorwin站在(i,j)的时候,她可以走向(i+1,j)或者(i,j+1) (然而她不能走出这个花园)。
当Gorwin到达一个格子的时候,她可以把那个格子里面的蛋糕吃完或者不吃。但是,她不能只吃一部分。她的胃不是那么大,所以她最多只能吃K千克的蛋糕。现在,Gorwin站在左上角,她在看蛋糕园的地图,想要找出一条路,能够使得她吃到的蛋糕最多的一条路。请你来帮帮忙。
多组测试数据(大概15组), 每一组数据在一行中给出n, m, K. 在接下来n行中,第i行有m个整数wi1,wi2,wi3,?wim ,代表第i行m个蛋糕的重量。 请处理到文件末尾。 [参数约定] 所有输入均为整数。 1<=n,m,K<=100 1<=wij <=100
对于每一个数据,输出一个值,代表Gorwin最多能吃到的蛋糕重量。
1 1 2 3 2 3 100 1 2 3 4 5 6
0 16
在第一组数据中,Gorwin不能吃蛋糕的一部分,所以她不能吃掉任何蛋糕。 在第二个数据中,Gorwin按照以下路径行走(1,1)->(2,1)->(2,2)->(2,3)当她通过一个格子的时候,就把那个格子里面的蛋糕吃光。这样她吃的总重量就是1+4+5+6=16。
#include <bits/stdc++.h> using namespace std; #define maxn 100 + 5 int a[maxn][maxn]; int d[maxn][maxn][maxn]; int n, m, k; void solve() { memset(d, 0, sizeof(d)); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) for(int t=0; t<=k; t++) { if(t < a[i][j]) d[i][j][k] = max(d[i-1][j][t], d[i][j-1][t]); else d[i][j][t] = max(max(d[i-1][j][t], d[i][j-1][t]), max(d[i-1][j][t-a[i][j]]+a[i][j], d[i][j-1][t-a[i][j]]+a[i][j])); } int ans = 0; for(int i=1; i<=k; i++) ans = max(ans, d[n][m][i]); printf("%d\n", ans); } int main() { while(~scanf("%d%d%d", &n, &m, &k)) { for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d", &a[i][j]); solve(); } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。