动态规划-背包DP
背包DP是线性DP中一种特殊的DP。
01背包
最基础的背包,有
核心代码
void solve() { int n, V; cin >> n >> V; for (int i = 1; i <= n; i++) { cin >> v[i] >> w[i]; } for (int i = 1; i <= n; i++) { for (int j = V; j >= v[i]; j--) { // 注意倒序更新 dp[j] = max(dp[j], dp[j - v[i]] + w[i]); // 体积均为j,取价值最大的 } } cout << dp[V] << "\n"; }
完全背包
有
核心代码
void solve() { int n, V; cin >> n >> V; for (int i = 1; i <= n; i++) { cin >> v[i] >> w[i]; } for (int i = 1; i <= n; i++) { for (int j = v[i]; j <= V; j++) { dp[j] = max(dp[j], dp[j - v[i]] + w[i]); } } cout << dp[V] << "\n"; }
例题
完全背包问题
分组背包
有
核心代码
void solve() { int N, V, S; cin >> N >> V; vector<int> v[N + 1], w[N + 1], dp(V + 1); for (int i = 1; i <= N; i++) { cin >> S; v[i].resize(S); w[i].resize(S); for (int j = 0; j < S; j++) { cin >> v[i][j] >> w[i][j]; } } for (int i = 1; i <= N; i++) { for (int j = V; j >= 0; j--) { for (int k = 0; k < v[i].size(); k++) { if (j >= v[i][k]) { dp[j] = max(dp[j], dp[j - v[i][k]] + w[i][k]); } } } } cout << dp[V] << "\n"; }
多重背包
有
核心代码
void solve() { int N, V; cin >> N >> V; vector<int> v(N + 1), w(N + 1), s(N + 1), dp(V + 1); for (int i = 1; i <= N; i++) { cin >> v[i] >> w[i] >> s[i]; } for (int i = 1; i <= N; i++) { for (int j = 1; j <= s[i]; j++) { for (int k = V; k >= v[i]; k--) { dp[k] = max(dp[k], dp[k - v[i]] + w[i]); } } } cout << dp[V] << "\n"; }
例题:
多重背包问题 I
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现