具体算法见算法导论第15章动态规划
public class Main {
public static void main(String[] args) {
int[] p = new int[] { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 };
for (int i = 1; i <= 100; i++) {
System.out.println(cutNumF(p, i));
}
}
public static int cutNumF(int[] p, int n) {
int[] r = new int[n + 1];
for (int i = 0; i <= n; i++) {
r[i] = Integer.MIN_VALUE;
}
return cutNum(p, n, r);
}
public static int cutNum(int[] p, int n, int[] r) {
int q = 0;
if (r[n] >= 0) {
return r[n];
}
if (n == 0) {
q = 0;
} else {
q = Integer.MIN_VALUE;
for (int i = 1; i <= n; i++) {
q = Math.max(q, p[i] + cutNum(p, n - i, r));
}
}
r[n] = q;
return q;
}
}