1.自顶向下的递归实现
#include <iostream>
#define N 33
using namespace std;
int s[N + 1];
int p[N + 1] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50, 51, 52,55};
int cutRod(int p[],int n) {
if(n == 0)
return 0;
int q = -1;
for(int i = 1; i <= n; i++) {
int pp = p[i] + cutRod(p, n-i);
if(q < pp) {
q = pp;
s[n] = i;
}
}
return q;
}
void printCutRodSolution(int n) {
while(n > 0) {
cout<<s[n]<<" ";
n -= s[n];
}
}
int main() {
int n;
cin>>n;
int ans = cutRod(p, n);
cout<<ans<<endl;
printCutRodSolution(n);
return 0;
}
2.带备忘的自顶向下递归实现
#include <iostream>
#define N 33
using namespace std;
int r[N + 1], s[N + 1];
int p[N + 1] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50, 51, 52,55};
int memoizedCutRodAux(int p[], int n, int r[]) {
int q = -1;
if(r[n] >= 0)
return r[n];
if(n == 0)
q = 0;
else
for(int i = 1; i <= n; i++)
if(q < p[i] + memoizedCutRodAux(p, n-i, r)) {
q = p[i] + memoizedCutRodAux(p, n-i, r);
s[n] = i;
}
r[n] = q;
return q;
}
int memoizedCutRod(int p[], int n) {
for(int i = 0; i <= n; i++)
r[i] = -1;
return memoizedCutRodAux(p, n, r);
}
void printCutRodSolution(int n) {
while(n > 0) {
cout<<s[n]<<" ";
n -= s[n];
}
}
int main() {
int n;
cin>>n;
int ans = memoizedCutRod(p, n);
cout<<ans<<endl;
printCutRodSolution(n);
return 0;
}
3.自底向上实现
#include <iostream>
#define N 33
using namespace std;
int r[N + 1], s[N + 1];
int p[N + 1] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50, 51, 52,55};
int bottomUpCutRod(int p[], int n) {
int q = -1;
r[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++)
if(q < p[j] + r[i - j]) {
q = p[j] + r[i - j];
s[i] = j;
}
r[i] = q;
}
return r[n];
}
void printCutRodSolution(int n) {
while(n > 0) {
cout<<s[n]<<" ";
n -= s[n];
}
}
int main() {
int n;
cin>>n;
int ans = bottomUpCutRod(p, n);
cout<<ans<<endl;
printCutRodSolution(n);
return 0;
}
测试数据
29