钢条切割问题
问题描述: \(Serling\)公司购买长钢条,将其切割为短钢条出售。不同的切割方案,收益是不同的,怎么切割才能有最大的收益呢?
-
假设切割工序本身没有成本支出
假定出售一段长度为\(i\)英寸的钢条的价格为\(p_i(i = 1 , 2 , ...)\) ,给定以下价格表:
length \(i\) 1 2 3 4 5 6 7 8 9 10 price \(p_i\) 1 5 8 9 10 17 17 20 24 30 比较明显的完全背包问题,我们定义状态\(f_i\)表示使用容量为\(i\)的背包能获得的最大的价值,它可以由所有长度小于等于\(i\)的钢条转移而来,即转移方程可表示为
\[f_i = max(f_i , f_{i - length_j} + p_j)\; \forall 1 \leq j \leq 10 \]参考代码:
const int N = 2e5 + 5; int length[N], p[N]; int f[N], n, m;//n种长度的钢条及其价格 钢条总长为m void solve() { cin >> n >> m; for (int i = 1; i <= n; ++i) cin >> length[i] >> p[i]; for (int i = 1; i <= n; ++i) { for (int j = length[i]; j <= m; ++j) f[j] = max(f[j], f[j - length[i]] + p[i]); } cout << f[m] << '\n'; return; }
-
切割工序有成本支出
假设成本为\(c\),则只需要对所有的\(p_i \; \forall 1 \leq i \leq n\)都减去\(c\)作为新的\(p_i\),再跑一遍上述程序即可求得答案。
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。