思路:首先就是判断一组数据是否有无限个凑不出来,这里直接说结论,就是任意两个数字都互质就是有限个,这里用到的是动态规划,具体看代码注释
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int f(int a, int b) {
return a % b == 0 ? b : f(b, a % b);
}
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int m, n, j, i, k;
scanf("%d", &n);
int kp[10000];
for (i = 0; i < n; i++)scanf("%d", &kp[i]);
k = kp[0];
for (i = 1; i < n; i++) {
k = f(k, kp[i]);//找出这写数字的最小公因数
}
if (k!=1) {//如果最小公因数不等与一(就是任何两个数字不互质的时候)就有无数个组合不出来
printf("INF");
return 0;
}
kp[0] = 1;
int dp[10001] = { 0 };//dp[i]表示能否组合出i个包子,dp[i]=0说明不可以,dp[i]=1说明可以
for (i = 0; i < n; i++) {//列举每一个包子
for (j = kp[i]; j < 10001; j++) {//列举凑出来的数字
dp[j] = max(dp[j], dp[j - kp[i]]);//凑出来有两种情况,要摸原本就有这个,要摸能凑出j-kp[i],在加上kp[i]就可以凑出j
}
}
int sum = 0;
for (i = 0; i < 10001; i++) {
if (dp[i] == 0) {//最后统计,如果等于0说明凑不出来
sum++;
}
}
printf("%d", sum);
return 0;
}