題目
小易有n塊磚塊,每一塊磚塊有一個高度。小易希望利用這些磚塊堆砌兩座相同高度的塔。爲了讓問題簡單,磚塊堆砌就是簡單的高度相加,某一塊磚只能使用在一座塔中一次。小易現在讓能夠堆砌出來的兩座塔的高度儘量高,小易能否完成呢。
- 輸入描述:
輸入包括兩行:第一行爲整數n(1 ≤ n ≤ 50),即一共有n塊磚塊,第二行爲n個整數,表示每一塊磚塊的高度height[i] (1 ≤ height[i] ≤ 500000) - 輸出描述:
如果小易能堆砌出兩座高度相同的塔,輸出最高能拼湊的高度,如果不能則輸出-1。保證答案不大於500000。 - 輸入例子:
3
2 3 5 - 輸出例子:
5
分析1
不能按照
當
代碼1
import java.util.Scanner;
public class Main {
static void tower(int[] bricks, int[][] h, int n, int sum) {
h[0][0] = 0;
for (int i = 1; i <= sum; i++) {
h[0][i] = Integer.MIN_VALUE;
}
for (int i = 1; i <= n; i++) {
int b = bricks[i - 1];
for (int j = 0; j <= sum; j++) {
h[i][j] = h[i - 1][j];
if (j + b <= sum) {
h[i][j] = Math.max(h[i][j], h[i - 1][j + b] + b);
}
if (b - j >= 0) {
h[i][j] = Math.max(h[i][j], h[i - 1][b - j] + b - j);
} else {
h[i][j] = Math.max(h[i][j], h[i - 1][j - b]);
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] bricks = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
bricks[i] = sc.nextInt();
sum = sum + bricks[i];
}
int[][] h = new int[n + 1][sum + 1];
tower(bricks, h, n, sum);
System.out.println(h[n][0] > 0 ? h[n][0] : -1);
}
}
分析2
另一種簡單的解法是定義
代碼2
import java.util.Scanner;
public class Main {
static void tower(int[] bricks, int[][] h, int n, int sum) {
for (int i = 0; i < 2 * sum + 1; i++) {
h[0][i] = Integer.MIN_VALUE;
}
h[0][sum] = 0;
for (int i = 1; i <= n; i++) {
int b = bricks[i - 1];
for (int j = 0; j < 2 * sum + 1; j++) {
h[i][j] = h[i - 1][j];
if (j - b >= 0) {
h[i][j] = Math.max(h[i][j], h[i - 1][j - b]);
}
if (j + b < 2 * sum + 1) {
h[i][j] = Math.max(h[i][j], h[i - 1][j + b] + b);
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] bricks = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
bricks[i] = sc.nextInt();
sum = sum + bricks[i];
}
int[][] h = new int[n + 1][2 * sum + 1];
tower(bricks, h, n, sum);
System.out.println(h[n][sum] > 0 ? h[n][sum] : -1);
}
}