USACO Beef McNuggets
洛谷 P2737 [USACO4.1]麦香牛块Beef McNuggets
https://www.luogu.org/problem/P2737
JDOJ 1813: Beef McNuggets 麦香牛块
https://neooj.com/oldoj/problem.php?id=1813
题目描述
农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”,奶牛们说,“如果你用只有一次能装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 的正整数.
输入
第1 行: 包装盒的种类数N
第2 行到N+1 行: 每个种类包装盒容纳麦香牛块的个数
输出
输出文件只有一行数字:顾客不能用包装盒买到麦香牛块的最大块数或0(如果在限定范围内所有购买方案都能得到满足).
样例输入
3
3
6
10
样例输出
17
完全背包进阶题型
代码:
#include<cstdio> #include<algorithm> using namespace std; int n,ans; int m=256*256; int dp[100001],a[11]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); if(a[1]==1) { printf("0"); return 0; } dp[0]=1; for(int i=1;i<=n;i++) for(int j=a[i];j<=m;j++) if(dp[j-a[i]]) dp[j]=1; for(int i=m;i>=1;i--) if(dp[i]==0) { ans=i; break; } if(ans>m-2*256) ans=0; printf("%d",ans); return 0; }