题目链接: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;
}