题解:B4290 [蓝桥杯青少年组省赛 2022] 组合
思路
本题可以使用动态规划。设
难点
1.如何判断有无限种数量的汤圆不能买到?
设所有数的最大公约数为 -1。
证明:
当 -1。
2.dp 上限是多少?
对于
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef const ll cll;
typedef vector<ll>vll;
typedef string str;
typedef pair<ll, ll>pll;
#define pb push_back
#define st first
#define nd second
cll llmi = -9187201950435737472;
cll llma = 9187201950435737471;
cll N=1e6;
ll n,a[1000005],m,x,ans;
bool dp[1005005];
int main() {
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
x=__gcd(a[i],x),m+=a[i];
dp[a[i]]=1;
}
if(x!=1){printf("-1");return 0;}
for(int i=1;i<=N;i++){
for(int j=1;j<=n;j++){
if(i-a[j]>0)dp[i]|=dp[i-a[j]];
}
if(!dp[i])ans++;
}
printf("%lld",ans);
return 0;
}