CS153/hw4/hw4programs/rod_cutting.oat

63 lines
1.5 KiB
Text
Raw Permalink Normal View History

bool arr_eq(int[] arr1, int[] arr2, int n) {
var flag = true;
for(var i = 0; i < n; i = i + 1;) {
flag = flag & (arr1[i] == arr2[i]);
}
return flag;
}
void clear_arr(int[] arr, int length) {
for (var i = 0; i < length; i = i + 1;) { arr[i] = 0; }
return;
}
/* Adapted from CLRS */
int optimal_cuts (int[] prices, int length, int[] choices) {
var max_price = new int[length + 1];
max_price[0] = 0;
var first_cut = new int[length + 1];
clear_arr(first_cut, length + 1);
for (var j = 1; j <= length; j = j+1;) {
var max_j = 0;
for (var i = 1; i <= j; i = i+1;) {
var new_soln = prices[i] + max_price[j - i];
if (new_soln > max_j) {
max_j = new_soln;
first_cut[j] = i;
}
}
max_price[j] = max_j;
}
var n = length;
/* First cut stores the largest optimal cut that can be made */
/* We can recurse downwards to construct the final answer */
while (n > 0) {
var cut = first_cut[n];
choices[cut] = choices[cut] + 1;
n = n - cut;
}
return max_price[length];
}
int program (int argc, string[] argv) {
var prices = new int[] {0, 1, 5, 11, 13, 15, 17, 17, 20, 24, 30};
var length = 10;
var cuts = new int[length + 1];
clear_arr(cuts, length + 1);
var max_price = optimal_cuts(prices, length, cuts);
var expected_max_price = 35;
var expected_cuts = new int[]{0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0};
if (expected_max_price == max_price &
arr_eq(expected_cuts, cuts, length + 1)) {
return max_price;
} else {
return 0;
}
}