点击跳转例题
思路:先判断特殊情况,什么情况下会得到INF,那就是所有得数的最大公约数>1的情况。
我们发现了最优子结构:f(i)表示能否得到 i ,而且具有后效性。f(j)表示前i个数,能否得到 j 。
状态转移:f(i)==true,那么f(i+a[i])==true。
因为最大为100,所以第二维最多枚举到1e4即可。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int a[N],f[N]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int Gcd=0; for(int i=1;i<=n;i++) Gcd=__gcd(Gcd,a[i]); if(Gcd>1) { cout<<"INF"<<endl; return 0; } f[0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<=1e4+10;j++) { if(f[j]) f[j+a[i]]=1; } } int ans=0; for(int i=1;i<=1e4+10;i++) if(!f[i]) ans++; cout<<ans<<endl; return 0; }
P8646 [蓝桥杯 2017 省 AB] 包子凑数--gcd,背包
最新推荐文章于 2024-05-17 09:49:17 发布