题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5234

题意涉及到取与不取求最大值的问题,很容易想到的是运用背包去求解,不过这是在一个二维的格子中我们不能只是用一个简单的二维背包,而是运用一个三维的背包,又因为每次只能向下和向右走,所以我们的状态转移方程也就是向下和向右转移即可。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 102;
int G[maxn][maxn],dp[maxn][maxn][maxn];
int Max,n,m,V;
int main()
{
while(scanf("%d%d%d",&n,&m,&V) !=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&G[i][j]);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
for(int k=V; k>=0; k--)
{
dp[i][j][k] = max(dp[i-1][j][k], dp[i][j-1][k]);
if(k >= G[i][j])
{
dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k-G[i][j]]+G[i][j]);
dp[i][j][k] = max(dp[i][j][k], dp[i][j-1][k-G[i][j]]+G[i][j]);
}
}
printf("%d\n",dp[n][m][V]);
}
return 0;
}