目录
显示
题目链接
https://www.luogu.org/problem/P2737
题解
第一眼看到这道题的时候:我去,这不就是小凯的疑惑嘛!
这让我想起了 NOIp2018 上同样的场景。当我看到货币系统的时候,也想到了 exgcd。
然而事实是残酷的。(因为我们可以拿三种以上的货币组成新货币)
好了,我们接下来进入正题。
虽然本题的解法并非 exgcd,但这道题在 \(n=2\) 的特例,即两个互质数 \(p,q\) 的自然数倍之和,所不能表示的最大数字为 \(p*q-p-q\) 的结论,还是有些帮助的。
这道题和货币系统的相似之处就是,它们都可以用背包的方法做出来。
因为数字的上限为 \(256\),所以我们枚举的上限也就是 \(256^2-256*2+1=65025\)。(不懂的话再翻回去看一下结论吧)
#include <cstdio> #include <algorithm> #define MAXANS 65025 using namespace std; int a[15],f[70005]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); f[0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=MAXANS;j++) if(j-a[i]>=0&&f[j-a[i]])f[j]=1; for(int i=MAXANS;i>0;i--) if(!f[i]) { if(i<=MAXANS-1)printf("%d\n",i); else break; return 0; } puts("0"); return 0; }