运用欧几里得定理(辗转相除法)可得:
假设我们输入的n个数,他们的最大公约数都不是1 。即 :他们都是偶数或者都是奇数。那么,肯定有无数多个数是凑不出来的,直接输出INF即可。
只要包子笼的容量中存在一对数据最大公约数为1,即互质,那么这个包子数目就是可以凑数出来的。
import java.util.Scanner;
public class BaoZiCouShu{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < nums.length; i++) {
nums[i] = sc.nextInt();
}
//运用欧几里得定理(辗转相除法)可得:
//假设我们输入的n个数,他们的最大公约数都不是1 。即 :他们都是偶数或者都是奇数。那么,肯定有无数多个数是凑不出来的,直接输出INF即可
//只要包子笼的容量中存在一对数据最大公约数为1,即互质,那么这个包子数目就是可以凑数出来的
boolean judge = false;
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
if(gcd(nums[i], nums[j]) == 1){
judge = true;
}
}
}
if(judge == false){
System.out.println("INF");
return;
}
int[][] dp = new int[n + 1][10001];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 10000; j++) {
if (j < nums[i - 1]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - nums[i - 1]] + nums[i - 1]);
}
}
}
int res = 0;
for (int j = 1; j <= 10000; j++) {
if (dp[n][j] != j) {
res++;
}
}
System.out.println(res);
}
public static int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
}