package experience13; import java.util.Arrays; public class Load { // 集装箱数 static int n; // 集装箱重量数组 static int[] weightArray; // 第一艘轮船的载重量 static int c; // 当前载重量 static int currentWeight; // 当前最优载重量 static int bestWeight; // 剩余集装箱重量 static int rest; // 当前解 static int[] currentSolution; // 当前最优解 static int[] bestCurrentSolution; public static int maxLoading(int[] ww, int cc, int[] xx) { n = ww.length; weightArray = ww; c = cc; currentWeight = 0; bestWeight = 0; currentSolution = new int[n]; bestCurrentSolution = xx; for (int i = 0; i < n; i++) { rest += weightArray[i]; } backtrack(0); return bestWeight; } public static void backtrack(int i) { if (i >= n) { if (currentWeight > bestWeight) { for (int j = 0; j < n; j++) { bestCurrentSolution[j] = currentSolution[j]; } bestWeight = currentWeight; } return; } rest -= weightArray[i]; if (currentWeight + weightArray[i] <= c) { currentSolution[i] = 1; currentWeight += weightArray[i]; backtrack(i + 1); currentWeight -= weightArray[i]; } if (currentWeight + rest > bestWeight) { currentSolution[i] = 0; backtrack(i + 1); } rest += weightArray[i]; } public static void main(String[] args) { weightArray = new int[]{5, 2, 1, 3}; c = 10; int[] array = new int[4]; System.out.println(maxLoading(weightArray, c, array)); System.out.println(Arrays.toString(array)); } }分析算法时间复杂性
时间: 2024-02-15 15:27:54 浏览: 17
该算法使用了回溯法求解装载问题,时间复杂度取决于搜索树的大小。具体来说,搜索树的节点数为 $2^n$,其中 $n$ 为集装箱数。因此,该算法的时间复杂度为 $O(2^n)$。
在实际应用中,如果集装箱数较多,该算法的时间复杂度会非常高,因此需要采用更加高效的算法来解决装载问题。例如,可以使用动态规划、贪心算法等方法来降低时间复杂度。
相关问题
package step1; /** * @author pengzheng */ import java.util.Arrays; // 导入数组工具类 Arrays import java.util.Scanner; public class TestIntArray { public static void main(String[] args) { … for (int e : a) { // 使用增强型for循环遍历数组 System.out.print(e + " "); } } }
好的,以下是一个基本数据类型数组的练习题:
请编写一个程序,要求用户输入一个整数n,然后创建一个长度为n的整型数组,再依次从键盘读入n个整数,并将它们存储到数组中。最后,输出数组中的所有元素(可以使用增强型for循环)。
示例输入:
5
1
2
3
4
5
示例输出:
输入的数组为:[1, 2, 3, 4, 5]
参考代码:
```java
import java.util.Arrays;
import java.util.Scanner;
public class TestIntArray {
public static void main(String[] args) {
// 创建Scanner对象
Scanner scanner = new Scanner(System.in);
// 读取数组长度
System.out.print("请输入数组长度:");
int length = scanner.nextInt();
// 创建数组
int[] arr = new int[length];
// 循环读取数组元素
for (int i = 0; i < length; i++) {
System.out.print("请输入数组第" + (i + 1) + "个元素:");
arr[i] = scanner.nextInt();
}
// 输出数组
System.out.println("输入的数组为:" + Arrays.toString(arr));
// 使用增强型for循环遍历数组并输出
for (int e : arr) {
System.out.print(e + " ");
}
}
}
```
package DiLiuZhang; import java.sql.Date; import java.util.Date; public class Circle { public static void main(String[] args) { java.sql.Date date=new java.sql.Date(); java.util.Date date1=new java.util.Date(); } }
这段代码存在一个错误,编译会报错。
原因是在该代码中同时导入了 `java.sql.Date` 和 `java.util.Date`,两者名称相同,会发生冲突。需要对其中一个进行重命名,或者使用全限定名来避免冲突。
以下是修改后的代码:
```java
package DiLiuZhang;
import java.sql.Date;
import java.util.Date as UtilDate;
public class Circle {
public static void main(String[] args) {
Date sqlDate = new Date(System.currentTimeMillis());
UtilDate utilDate = new UtilDate();
}
}
```
通过为 `java.util.Date` 起一个别名 `UtilDate`,可以避免与 `java.sql.Date` 发生冲突。同时,为了区分使用的是哪个类,还需要使用全限定名来创建对象。