#include<iostream>
#include<vector>
using namespace std;
class Node {//用来存储切割长度数组
public:
int *m, *b;
Node(int *r, int *s,int k) {
m = new int[k + 1];
b = new int[k + 1];
for (int i = 0; i <= k; i++) {
m[i] = r[i];
b[i] = s[i];
}
}
~Node() {
delete[]m;
delete[]b;
}
};
void Init(vector<int> &p) {
int n;
int a;
cout << "请输入价格表个数:" << endl;
cin >> n;
p.push_back(n);//将p的个数存在p[0]处
cout << "请输入各自的价格收益:" << endl;
for (int i = 0; i < n; i++) {
cin >> a;
p.push_back(a);
}
}
Node *EXTENDED_BOTTOM_UP_CUT_ROD(vector<int> &p, int n,int *r,int *s) {
r = new int[n + 1];
s = new int[n + 1];
r[0] = 0;
for (int j = 1; j <= n; j++) {
int q = -1;
for (int i = 1; i <= j; i++) {
if (q < p[i] + r[j - i]) {
q = p[i] + r[j - i];
s[j] = i;
}
}
r[j] = q;
}
return new Node(r, s, n);
}
void PRINT_CUT_ROD_SOLUTION(vector<int> &p, int n,int *r,int *s) {
Node *node = EXTENDED_BOTTOM_UP_CUT_ROD(p,n,r,s);
while (n > 0) {
cout << node->b[n] << " ";
n -= node->b[n];
}
}
void Delete(int *r, int *s) {//释放动态数组
delete[]r;
delete[]s;
}
int main() {
vector<int> p;
int *r=NULL, *s=NULL;
int n;
cout << "请输入要求的长度:" << endl;
cin >> n;
Init(p);
PRINT_CUT_ROD_SOLUTION(p,n,r,s);
Delete(r, s);
system("pause");
return 0;
}
算法导论动态规划钢条切割
最新推荐文章于 2024-05-23 16:51:03 发布