返回顶部

钢条切割问题

问题描述: \(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\),再跑一遍上述程序即可求得答案。

posted @ 2021-12-24 19:09  cherish-lgb  阅读(65)  评论(0编辑  收藏  举报