题目概述
包子凑数
题目描述
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 N 种蒸笼,其中第讠种蒸笼恰好能放4;个包子。每种蒸笼都有非常多笼,可以认为是无限笼。
每当有顾客想买 X 个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有 X个包子。比如一共有 3种蒸笼,分别能放 3、4 和5个包子。当顾客想买 11 个包子时,大叔就会选2笼3 个的再加1笼5 个的(也可能选出1笼3个的再加2笼4个的)。
当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3 种蒸笼,分别能放 4、5 和6个包子。而顾客想买7个包子时,大叔就凑不出来了。
小明想知道一共有多少种数目是包子大叔凑不出来的。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;//表示数组的最大长度
int dp[maxn], a[105];//dp[i]代表拿i个包子是否可能,1表示可能,0表示不可能 和输入的数组。
int gcd(int a, int b) {
return b?gcd(b,a%b):a;
}
int main() {
int n, g, num = 0;
cin>>n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
g = gcd(a[0], a[1]);
for (int i = 2; i < n; i++) {
g = gcd(g, a[i]);
}//两两求最大公因子
if (g != 1) cout << "INF" << endl; //不互质,则有无限种都不能表示
else {
dp[0] = 1;//0个包子肯定可以
for (int i = 0; i < n; i++) {
for (int j = 0; j +a[i]< maxn; j++) {
if (dp[j]) {
dp[j + a[i]] = 1;
}
}
}//给可以表示的加上标签1
for (int i = 0; i < maxn; i++) {
if(!dp[i]) {
num++;
}
}//顺序遍历 统计不能计算的 将其输出
cout << num << endl;
}
return 0;
}