メソッドcutRodとbottomUpCutRodを変更して、配列の長さよりも長い長さを保持する方法を教えてください。たとえば、現在pの長さは11ですが、この配列を持つ長さ15,20などの棒をどのように切断できますか? IはcutRod(P、10)を呼び出す場合RodCutting:ロッドが配列の長さより大きい場合
p = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
例えば、I 30を得るが、それはcutRod(P、15)に、もちろんクラッシュまたは cutRod(P、20)。 (bottomUpCutRodにも同じことが適用されます)。どのようにこれを行うにはどのようなアイデア?これは動的プログラミングの問題です。bottomUpCutRodメソッドを実装する私のアイデアは、pをたどることです。各要素について、それ自身とその近傍のすべての順列を計算し、必要に応じて結果の配列rを更新します。
public class Main {
private static final double MINUS_INFINITY = Double.NEGATIVE_INFINITY;
public static void main(String[] args) {
// price array
double[] p = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
// test cutRod
cutRod(p,10);
// test bottomUpCutRod
bottomUpCutRod(p,10);
}//end of main
// an optimal cut for a rod of length n
// p is the price array
// use recursion
private static double cutRod(double[] p, int value) {
double[] r = new double[value+1];
double out = 0;
// initialize r to NEGATIVE_INFINITY;
for (int i = 1; i < r.length; i++)
r[i] = MINUS_INFINITY;
// call the helper method
out = helpCutRod(p,r.length-1,r);
// print r
System.out.println("Result ");
System.out.println("r[" + (r.length-1) + "] = " + r[r.length-1]);
return out;
}//end of method
// helpCutRod computes an optimal cut for a rod
// p is the price array and r[i] is the optimal cut for a rod of length i
// n is the length of the rod that is currently being computed
private static double helpCutRod(double[] p, int n, double[] r) {
double q = MINUS_INFINITY;
if (r[n] >= 0) // the whole r was computed
return r[n];
if (n == 0)
q = 0;
else {
for (int i = 1; i <= n; i++) {
q = RodCutting.max(q, p[i] + helpCutRod(p,n-i,r));
}
r[n] = q;
}
return q;
}
// use the bottom-up approach
// do NOT use recursion
private static double bottomUpCutRod(double[] p, int len) {
// r[i] is the optimal cut for a rod of length i
double[] r = new double[len+1];
r[0] = 0;
for (int j = 1; j < p.length; j++) {
// compute r[j]
double q = MINUS_INFINITY;
// r[j] is the maximum over i of p[i] + r[j-i]
// where 1<= i <= j
for (int i = 1; i <= j; i++)
q = max(q, p[i] + r[j-i]);
// update value of r[j]
r[j] = q;
}//end of for outer
// print r
System.out.println("The r array from the bottomUpCutRod:");
System.out.println("r[" + len + "] = " + r[len]);
return r[len] ;
}//end of method
public static double max(double a, double b){
if(a<=b){
return b;
}else{
return a;
}
}//end of max
}//end of class
おそらく、インデックスにアクセスしようとする前に、インデックスの長さが配列の長さよりも大きいかどうかをチェックすることによって、 –
はい私はこのクラッシュを避けることができますが、私が解決しようとしているのは、任意の長さで動作するアルゴリズム、長さnのロッドをどのように切断するかです。 –
@ MarkDwayne * "https://code-industry.net/free-pdf-editor/" *配列の長さは何ですか? –