1. 程式人生 > >刪數最小值問題(Java實現)——貪心演算法

刪數最小值問題(Java實現)——貪心演算法

刪數最小值問題——貪心演算法

【問題描述】

給定一個 n 位正整數 a , 去掉其中 k<=n 個數字後按原左右次序將組成一個新的正整數。對給定的 a ,  k 尋找一種方案,使得剩下的數字組成的新數最小。

程式原始碼:

package SF;
import java.util.*;
public class 刪數最小值問題 {
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		System.out.println("請輸入正整數a的位數n:");
		int n = reader.nextInt();
		int[] a = new int[n];		//正整數a
		for(int i=0;i<n;i++){		//物品重量取隨機數1~9
			a[i] = ((int) Math.floor(Math.random()*9)+1);
		}
		System.out.println("獲取隨機的正整數a為:");
		for(int i=0;i<n;i++){
			System.out.print(a[i]);
			}
		System.out.println("");
		System.out.println("請輸入正整數k(k<=n):");
		int k = reader.nextInt();
		刪數最小值問題 p = new 刪數最小值問題();
		for(int i=0;i<k;i++){
			p.del(a, k, n);
		}
		p.min(a, k, n);
	}
	void min(int[] a,int k,int n){
		int q;
		int o = 0;
		int[] s = new int[n-k];
		for(int i=0;i<n;i++){
			if(a[i]!=0){
				s[o] = a[i];
				o++;
			}
		}
		Arrays.sort(s);
		System.out.println("得到的剩餘數為:");
		for(int i=0;i<(n-k);i++){
			System.out.print(s[i]);
		}
	}
	void del(int[] a,int k,int n){
		int m;
		m = ((int)Math.floor(Math.random()*(n-1))+1);	//不取0號位
		if(a[m]!=0){
			a[m] = 0;
		}else{
			del(a, k, n);
		}
	}
}

執行截圖: