問題描述
小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有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);
}
}
}