当前位置:   article > 正文

蓝桥杯真题训练 包子凑数(数论)

蓝桥杯真题训练 包子凑数(数论)

题解

找到所有数的最大公约数,如果这个数大于1,则说明一定会有数是凑不出来的,即INF,否则的话,用dp去寻找每个数是否能被凑出来,若j-a[i]可以被凑出来,则j一定可以被凑出来,状态转移。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define endl '\n'
  5. ll n;
  6. ll a[105];
  7. ll ans;
  8. ll g;
  9. ll dp[1000005];//因为n是1e2 所以这里可以开1e6
  10. int flag=1;
  11. int main()
  12. {
  13. cin>>n;
  14. for(int i=1;i<=n;i++)
  15. {
  16. cin>>a[i];
  17. }
  18. g=a[1];
  19. for(int i=2;i<=n;i++)
  20. {
  21. g=__gcd(g,a[i]);//寻找所有数的最大公约数
  22. }
  23. if(g>1)//如果大于1了 肯定有无数个数找不到
  24. {
  25. flag=0;
  26. }
  27. dp[0]=1;
  28. if(flag)
  29. {
  30. for(int i=1;i<=n;i++)
  31. {
  32. for(int j=a[i];j<=1000000;j++)
  33. {
  34. dp[j]=max(dp[j],dp[j-a[i]]);//j可以由j-a[i]转移过来
  35. }
  36. }
  37. for(int i=1;i<=1000000;i++)
  38. {
  39. if(dp[i]==0)
  40. {
  41. ans++;
  42. }
  43. }
  44. cout<<ans<<endl;
  45. }
  46. else
  47. {
  48. cout<<"INF"<<endl;
  49. }
  50. return 0;
  51. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号