#include using namespace std; const int N = 20; int n, m; int w[N][N]; int f[N][N]; int a[N], al; void dfs(int u, int v) { if (u == 0) return; // 寻找当前状态f[i][j]是从上述哪一个f[i-1][k]状态转移过来的 for (int i = 0; i <= v; i++) { if (f[u - 1][v - i] + w[u][i] == f[u][v]) { a[++al] = i; dfs(u - 1, v - i); return; } } } int main() { // input cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> w[i][j]; // dp for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) for (int k = 0; k <= j; k++) f[i][j] = max(f[i][j], f[i - 1][j - k] + w[i][k]); cout << f[n][m] << endl; // find path dfs(n, m); int id = 1; for (int i = al; i; i--) cout << id++ << " " << a[i] << endl; return 0; }