背包记录路径
题意:
总公司拥有M台 相同 的高效设备,准备分给下属的N个分公司。
各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。
问:如何分配这M台设备才能使国家得到的盈利最大?
求出最大盈利值。
分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
- 我们把第件物品分配到件物品时花费定位,其价值就是
- 可以看作一个分组背包的问题,每次从组内选择一个物品即可
- 记录路径时,仅需要记录一下在第个物品已装容量为时的转移答案即可
- 输出答案,递归输出路径即可
书写递归匿名函数
function<返回类型(参数类型,...,参数类型)> 函数名 = [&](参数类型 参数名称,...)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,m; cin >> n >> m;
vector<vector<int> >a(n + 1,vector<int>(m + 1)),pre(n + 1,vector<int>(m + 1));
vector<int>dp(m + 1);
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= m;j ++) {
cin >> a[i][j];
}
}
for(int i = 1;i <= n;i ++) {
for(int j = m;j >= 0;j --) {
for(int k = 0;k <= m;k ++) {
if(j < k) continue;
if(dp[j] < dp[j - k] + a[i][k]) {
dp[j] = dp[j - k] + a[i][k];
pre[i][j] = k;
}
}
}
}
cout << dp[m] << '\n';
function<void(int,int)> output = [&](int x,int y) {
if(x == 0) return ;
int now = pre[x][y];
output(x - 1,y - now);
cout << x << ' ' << now << '\n';
};
output(n,m);
return 0;
}
标签:
DP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现