Dynamic Programming(动态规划)

  钢材分段问题

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    int Bottom_To_Up_Cut_Rod(vector<int> p, int n) {
        vector<int> r(n);
        r[0] = 0;
        int q = -65533;

        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= i; j++) {
                q = q > (p[j] + r[i - j]) ? q : (p[j] + r[i - j]);
            }
            r[i] = q;
        }

        return r[n];
    }
};

int main() {
    int nums[] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
    int len = (int)sizeof(nums)/sizeof(int);
    vector<int> p(len);
    Solution so;

    for(int i = 0; i < len; i++) {
        p[i] = nums[i];
    }

    cout << "请输入钢材的长度:";
    cin >> len;
    cout << "最大收益为:" << so.Bottom_To_Up_Cut_Rod(p, len) << endl;

    return 0;
}

  上面代码中的 nums[] 中的数据代表的含义是指钢材长度从0~10不同长度的价格。

  一般动态规划用于求解一类最优解(一般可归类为求解最大值或最小值)的问题,这里以《算法导论》给的这个例子为引子作为深入对算法等的学习。代码很简洁明了,所以我就不多解释了。

原文地址:https://www.cnblogs.com/darkchii/p/8137464.html