USACO-Section 4.1 Beef McNuggets (DP)
2016-04-14 12:54
274 查看
描述
农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。奶牛们正在想尽一切办法让这种可怕的设想泡汤。奶牛们进行斗争的策略之一是“劣质的包装”。“看,”奶牛们说,“如果你只用一次能装3块、6块或者10块的三种包装盒包装麦香牛块,你就不可能满足一次只想买1、2、4、5、7、8、11、14或者17块麦香牛块的顾客了。劣质的包装意味着劣质的产品。”你的任务是帮助这些奶牛。给出包装盒的种类数N(1<=N<=10)和N个代表不同种类包装盒容纳麦香牛块个数的正整数(1<=i<=256),输出顾客不能用上述包装盒(每种盒子数量无限)买到麦香牛块的最大块数。如果所有购买方案都能得到满足或者不存在不能买到块数的上限,则输出0。 不能买到的最大块数(倘它存在)不超过2,000,000,000。
格式
PROGRAM NAME: nuggetsINPUT FORMAT:
(file nuggets.in)
第1行: 包装盒的种类数N
第2行到N+1行: 每个种类包装盒容纳麦香牛块的个数
OUTPUT FORMAT:
(file nuggets.out)
输出文件只有一行数字:顾客不能用包装盒买到麦香牛块的最大块数或0(如果所有购买方案都能得到满足或者顾客不能买到的块数没有上限)。
SAMPLE INPUT
3 3 6 10
SAMPLE OUTPUT
17
无解的情况很好判断:①若最小数为1,则所有数都可以取到,即所以方案数都能满足
②若所有数的最大公约数不为1,则所有的方案数都是其公约数的整数倍,即不存在最大不能购买的上限
是不是我数学太渣了,题解的证明看了好久还是没弄明白上界是怎证明的,感觉不相关啊
“可以证明结果不会超过最大的两个数的最小公倍数”。我来证明一下。
已知,不定方程 ax + by = c ( a , b > 0 且 c >= ab )存在一组整数解( x0 , y0 ) (裴蜀定理)
求证,该不定方程存在一组非负整数解 ( xn , yn ) .
证明 : 由不定方程通解式得 : xn = x0 + b * t , yn = y0 - a * t ( t 是整数 )
令 xn , yn >= 0 解出 - ( x0 / b ) <= t <= ( y0 / a )
因为 c >= a * b 即 a * x0 + b * y0 >= a * b 两边同除 a * b 得 :
y0 / a - ( - x0 / b ) >= 1
所以一定存在 整数t使得 - ( x0 / b ) <= t <= ( y0 / a ) .
所以方程一定有非负整数解. 证毕.
/* ID: your_id_here PROG: nuggets LANG: C++ */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,a[15],ans; bool dp[65536+257]={false}; inline bool judge() { int gcd=a[0]; for(int i=1;i<n;++i) gcd=__gcd(gcd,a[i]); return gcd!=1; } int main() { freopen("nuggets.in","r",stdin); freopen("nuggets.out","w",stdout); scanf("%d",&n); for(int i=0;i<n;++i) { scanf("%d",a+i); dp[a[i]]=true; } sort(a,a+n); if(dp[1]||judge()) {//若数字中含有1,则全部都可以取到;若所有数的最大公约数不为1,则无最大解 printf("0\n"); return 0; } ans=0; for(int i=1;i<65537;++i) for(int j=0;j<n;++j) if(dp[i]) dp[i+a[j]]=true; else ans=i; printf("%d\n",ans); return 0; }
相关文章推荐
- OpenCV学习笔记(一)(二)(三)(四)(五)
- hdu1176免费馅饼·(类数塔问题)
- uc浏览器启动在pc端调试
- 随笔
- Python CPU,内存实时获取
- 调用 RelativeLayout measure()报 java.lang.NullPointerException
- 访问cdn有问题获取基本信息
- extjs正则表达式验证
- Android Studio 错误集
- 使用内部变量,删除,替换,UNSET,等字符操作
- Gradle - 实战笔记
- lightoj 1062 Crossed Ladders
- QT - Unknown debugger type “No engine”
- C语言数组遍历
- Spring整合activiti配置processEngine
- Android 支付宝接入流程
- 书写是为了更好的思考
- iOS开发获取系统表情
- spring IOC 和DI
- 曝光目前比较火热的现货原油投资主题诈骗真实内幕(转载)