#include using namespace std; const int N = 30; int n, m; int w[N][N]; int f[N][N]; int path[N][N]; //致敬墨染空大神 void out(int i, int j) { if (i == 0) return; //走出界就完事了 int k = path[i][j]; out(i - 1, j - k); //利用递推的栈机制,后序输出,太强了~ printf("%d %d\n", i, k); } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) scanf("%d", &w[i][j]); /*1、原始版本*/ for (int i = 1; i <= n; i++) for (int j = 0; j <= m; j++) { f[i][j] = f[i - 1][j]; path[i][j] = 0; for (int k = 1; k <= j; k++) { int val = f[i - 1][j - k] + w[i][k]; if (val >= f[i][j]) { f[i][j] = val; path[i][j] = k; } } } /*2、优化一下代码*/ /* for (int i = 1; i <= n; i++) for (int j = 0; j <= m; j++) { for (int k = 0; k <= j; k++) { int val = f[i - 1][j - k] + w[i][k]; if (val >= f[i][j]) { f[i][j] = val; path[i][j] = k; } } }*/ //输出最大值 printf("%d\n", f[n][m]); //输出路径 out(n, m); return 0; }