题意:给出n*m的格子,每个格子的值为w[i][j],在值不超过k的时候,可以往右或者往下走,问从(1,1)走到(n,m)能够得到的最大的值
类似于背包
d[i][j][k]=maxx(d[i-1][j][k],d[i-1][j][k-w[i][j]]+w[i][j],d[i][j-1][k],d[i][j-1][k-w[i][j]]+w[i][j]);

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=1000005; 17 18 int w[1005][1005]; 19 int d[105][105][105]; 20 21 int maxx(int a,int b,int c,int d){ 22 int ans; 23 ans=max(max(a,b),max(c,d)); 24 return ans; 25 } 26 27 int main(){ 28 int n,m,K; 29 while(~scanf("%d %d %d",&n,&m,&K)){ 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=m;j++) cin>>w[i][j]; 32 33 memset(d,0,sizeof(d)); 34 35 for(int i=1;i<=n;i++){ 36 for(int j=1;j<=m;j++){ 37 for(int k=w[i][j];k<=K;k++){ 38 d[i][j][k]=maxx(d[i-1][j][k],d[i-1][j][k-w[i][j]]+w[i][j],d[i][j-1][k],d[i][j-1][k-w[i][j]]+w[i][j]); 39 // printf("d[%d][%d][%d]=%d ",i,j,k,d[i][j][k]); 40 } 41 42 } 43 } 44 45 int ans=-INF; 46 for(int i=1;i<=K;i++) ans=max(ans,d[n][m][i]); 47 printf("%d ",ans); 48 } 49 return 0; 50 }
加油~~~~~~~~~~~~~~~~~~~~~~~~~~~~~