P1759 通天之潜水
主要回顾一下背包路径记录问题,dp问题的路径输出主要需要记录状态转移方程中状态是从哪一状态转移而来的。例如01背包中的状态转移方程dp[i][j] = max(dp[i][j], dp[i-1][j-w[i]]+v[i]),需要用path[i][j]=1来表示取了第i件物品,即dp[i][j] < dp[i-1][j-w[i]]+v[i] ( 若是要求字典序最小这里便不能加等号),回溯时只需要回溯到path( i-1, j-w[i] )状态即可,利用后序遍历可输出路径。
代码实现:
#include <bits/stdc++.h>
#define ll long long
#define mem( f, x ) memset( f, x, sizeof(f))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
#define pk push_back
using namespace std;
const int M = 205;
const int N = 105;
int m, n, v;
int a[N], b[N], c[N];
int dp