包子凑数 - 蓝桥云课 (lanqiao.cn)
题目描述
题目分析
对于此题是一个简单DP的翻版问题,若能凑出当前的包子数,则凑出之前一定为dp[i - a[j]],若表示出的dp[i]不是0则说明是一定存在数可以被凑出的,由题意:若凑不出的数字超过10000这个上界,我们就可以判断出有无穷个
最大不能表示出来的数必定有个上界,因为两个数a,b(当gcd=1时),最大不能表示出来的数是(a - 1)(b - 1) - 1,题目中的N为100,99和98是100内最大的互质的数,故这个上界选择10000
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7;
int a[N], dp[N];
int main()
{
int n, ans = 0;
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
dp[a[i]] ++;
}
for(int i = 1; i <= N; i ++)
{
for(int j = 1; j <= n; j ++)
{
if(i - a[j] < 0)continue;
dp[i] = dp[i - a[j]] + dp[i];
if(dp[i] != 0)break;//这个数可以被凑出
}
if(dp[i] == 0)ans ++;
}
if(ans > 10000)cout << "INF";
else cout << ans;
return 0;
}