Java——歷屆試題 包子湊數

問題描述

  小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有N種蒸籠,其中第i種蒸籠恰好能放Ai個包子。每種蒸籠都有非常多籠,可以認爲是無限籠。
  每當有顧客想買X個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5個包子。當顧客想買11個包子時,大叔就會選2籠3個的再加1籠5個的(也可能選出1籠3個的再加2籠4個的)。
  當然有時包子大叔無論如何也湊不出顧客想買的數量。比如一共有3種蒸籠,分別能放4、5和6個包子。而顧客想買7個包子時,大叔就湊不出來了。
  小明想知道一共有多少種數目是包子大叔湊不出來的。

輸入格式

  第一行包含一個整數N。(1 <= N <= 100)
  以下N行每行包含一個整數Ai。(1 <= Ai <= 100)

輸出格式

  一個整數代表答案。如果湊不出的數目有無限多個,輸出INF。

樣例輸入

2
4
5

樣例輸出

6

樣例輸入

2
4
6

樣例輸出

INF

樣例說明

  對於樣例1,湊不出的數目包括:1, 2, 3, 6, 7, 11。
  對於樣例2,所有奇數都湊不出來,所以有無限多個。

數據規模和約定

  峯值內存消耗(含虛擬機) < 256M
  CPU消耗 < 1000ms

import java.util.*;
public class Main{
	//求最大公約數,當最大公約數不爲1, 則湊不出來數量爲INF
	public static int Gcd(int num1, int num2) {
		if(num1 < num2) {
			int temp = num1;
			num1 = num2;
			num2 = temp;
		}
		int rem = -1;
		while(num1 % num2 != 0) {
			rem = num1 % num2;
			num1 = num2;
			num2 = rem;
		}
		return num2;
	}
	public static void main(String []argc) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		boolean gcdflag = false;
		int N[] = new int[n];
		int dp[] = new int[100000];
		int count = 0;
		dp[0] = 1;
		for(int i = 0;i<n;i++) {
			N[i] = scan.nextInt();
		}
		
		for(int i = 0;i<n;i++) {
			for(int j = i + 1;j<n;j++) {
				if(Gcd(N[i], N[j]) == 1){
					gcdflag = true;
				}
			}
		}
		if(gcdflag != true) {
			System.out.println("INF");
		}
		else {
			for(int i = 0;i<n;i++) {
				for(int j = N[i]; j<dp.length;j++) {
				   //如果當前數,減去N[i] 爲0, 即正好爲N[I], 說明當前數字可以由N[i]湊出
					if(dp[j - N[i]] == 1) {
						dp[j] = 1;
					}
				}
			}
			for(int i = 0;i < dp.length;i++) {
				if(dp[i] != 1) {
					count ++;
				}
			}
			System.out.println(count);
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章