首先要知道什么情况下是凑不出无限个自然数的---即输出INF
分析:
当输入的数组中所有数字的公共最大因子不为1的时候,假设为x,那么就可以提取出公因子x,
,这种情况下N只能是x的倍数,有无限个数是不能凑出的。
然后就是暴力遍历,有别的方法的大佬可以补充!
#include <bits/stdc++.h> using namespace std; int n; int a[101]; bool dp[10001]{false}; int gcd(int a, int b) { if (a < b) { a = a + b; b = a - b; a = a - b; } int res; while (b) { res = a % b; a = b; b = res; } return a; } void solve() { cin >> n; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); int share = gcd(a[1], a[2]); for (int i = 3; i <= n; i++) share = gcd(share, a[i]);//这里就是求最大公因子 if (share != 1) { cout << "INF" << endl; return; } dp[0] = true; for (int i = 1; i <= n; i++) { for (int j = 0; j + a[i] <= 10000; j++) { if (dp[j]) { dp[j + a[i]] = true; } } } int c = 0; for (int i = 1; i <= 10000; i++) { if (!dp[i]) c++; } cout << c << endl; } int main(void) { solve(); // cout << gcd(96, 75) << endl; //system("pause"); return 0; }
结语:
感觉这题只涉及到最大公因子的代码,然后就是思考什么情况下得INF这两点。