动态规划 之 钢条切割

动态规划 之 钢条切割_第1张图片
动态规划 之 钢条切割_第2张图片

自顶向下递归实现(Recursive top-down implementation)
程序CUT-ROD对等式(14.2)进行了实现,伪代码如下:

CUT-ROD(p, n)
    if n == 0
        return 0
    q = -∞
    for i = 1 to n
        q = max{q, p[i] + CUT-ROD(p, n - i)}
    return q

动态规划 之 钢条切割_第3张图片

上面解决中重复对一个子结构问题重复求解了,我们可以把这个过程记录下来

使用动态规划求解最优钢条切割(Using dynamic programming for optimal rod cutting)

动态规划 之 钢条切割_第4张图片
动态规划 之 钢条切割_第5张图片动态规划 之 钢条切割_第6张图片
动态规划 之 钢条切割_第7张图片


MEMOIZED-CUT-ROD(p, n)
    let r[0 : n] be a new array    // will remember solution values in r
    for i = 0 to n
        r[i] = -∞
    return MEMOIZED-CUT-ROD-AUX(p, n, r)

MEMOIZED-CUT-ROD-AUX(p, n, r)
    if r[n] ≥ 0    // already have a solution for length n ?
        return r[n]
    if n == 0
        q = 0
    else q = -∞
        for i = 1 to n    // i is the position of the first cut
            q = max{q, p[i] + MEMOIZED-CUT-ROD-AUX(p, n - i, r)}
    r[n] = q    // remember the solution value for length n
    return q

动态规划 之 钢条切割_第8张图片
动态规划 之 钢条切割_第9张图片
动态规划 之 钢条切割_第10张图片
动态规划 之 钢条切割_第11张图片

代码

#define _CRT_SECURE_NO_WARNINGS
#include

class Solution {
public:
	Solution(int x):len(x)
	{

	}

	int fun() {
		for (int i = 0; i <= len; i++) {
			memory[i] = 0;  // 初始化
		}
		for (int i = 1; i <= len; i++)
		{
			int q = min;
			for (int k = 1; k <= i; k++)
			{
				q =std::max( q , price[k] + memory[i - k]);   // 每次切割一次,这是核心
				record[i] = k;
			}
			memory[i] = q;
		}
		return memory[len];
	}

private:
	int price[11] = {0,1,5,8,9,10,17,17,20,24,30};  // 假定数据较小,对应价格
	int len;
	int memory[11];   // 记录 
	int record[11];   // 在哪里切割
	int min = -1;
};

int main()
{
	Solution a(4);
	std::cout <<a.fun() << std::endl;
}

你可能感兴趣的:(算法,动态规划,算法)