基礎練習 Huffuman樹
解法一:
import java.util.Arrays;
import java.util.Scanner;
public class Person {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int []arr=new int[n];//定義一個數組用來裝一個數列
int []brr=new int[n];//定義一個數組求出用來裝該數列構造Huffman樹的最小的兩個數之和費用
for (int i = 0; i < n; i++) {//這個循環用來把從鍵盤輸出的數存入arr數組
arr[i]=scanner.nextInt();
}
for (int i = 0; i <n; i++) {
Arrays.sort(arr);//對數組arr進行從小到大排序
if (i==n-1) {
brr[i]=arr[i];
}
else {
brr[i+1]=arr[i]+arr[i+1];//最小的兩個數之和(計算完了的沒管)
arr[i+1]=brr[i+1];//求和之後把新數值放回arr數組中
}
}
int sum=0;
for (int i = 0; i <n; i++) {
sum=sum+brr[i];
}
System.out.println(sum);
}
}
分析圖:這個沒有用完最小的兩個數相加求和後就把其刪除,而是把他們放在前面不去管它,再計算後面的數,這個圖是分析圖。
解法二:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Person {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
int a = sc.nextInt();
list.add(a);
}
boolean flag = true;
int sum = 0;
while (flag) {
if (list.size() < 2) {
System.out.println(sum);
flag = false;
} else {
int cc[] = new int[list.size()];
for (int i = 0; i < cc.length; i++) {
cc[i] = list.get(i);
}
Arrays.sort(cc);
int b = cc[0];
int c = cc[1];
int d = b + c;
list.remove(Integer.valueOf(b));
list.remove(Integer.valueOf(c));
sum += d;
list.add(d);
}
}
}
}