背包记录路径

题意:
总公司拥有M台 相同 的高效设备,准备分给下属的N个分公司。
各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。
问:如何分配这M台设备才能使国家得到的盈利最大?
求出最大盈利值。
分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。

  • 我们把第i件物品分配到j件物品时花费定位j,其价值就是aij
  • 可以看作一个分组背包的问题,每次从i组内选择一个物品即可
  • 记录路径时,仅需要记录一下在第i个物品已装容量为j时的转移答案即可
  • 输出答案,递归输出路径即可

c11 书写递归匿名函数
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;
}
posted @   x7x7g7c7  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩