对于此题是一个简单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
- 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;
- }