• [USACO4.1]麦香牛块Beef McNuggets 题解报告


    题目描述

    农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。奶牛们正在想尽一切办法让这种可怕的设想泡汤。奶牛们进行斗争的策略之一是“劣质的包装”。“看,”奶牛们说,“如果你只用一次能装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(如果所有购买方案都能得到满足或者顾客不能买到的块数没有上限)。

    输入输出样例

    输入样例#1:
    3
    3
    6
    10
    输出样例#1:
    17











    一个数论定理:

    对于自然数p,q,若gcd(p,q)=1,则p*q-p-q是p*x+q*y在x,y>=0的情况下最大取不到的数

    【证明略,我是蒟蒻QAQ,网上可以查到】

    题解

    有个这个定理,我们就可以把范围控制在256*256-2*256内了,然后用做一次背包就好了
    若最终结果大于上界或无解,则输出0
    【想了很久为什么大于上界无解QAQ,当有大于上界的取不到的数时,说明这些数不互质,那么不是这些数最大公约数的倍数的数肯定构造不出来,故可取无限大】

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    using namespace std;
    const int maxn=256*256*2,INF=2000000000,P=1000000007;
    
    inline int read(){
    	int out=0,flag=1;char c=getchar();
    	while(c<48||c>57) {if(c=='-') flag=-1;c=getchar();}
    	while(c>=48&&c<=57){out=out*10+c-48;c=getchar();}
    	return out*flag;
    }
    
    bool dp[maxn];
    
    int main(){
    	dp[0]=true;
    	int N=read(),v;
    	for(int i=1;i<=N;i++){
    		v=read();
    		for(int j=v;j<maxn;j++) dp[j]=dp[j]||dp[j-v];
    	}
    	int ans=0;
    	for(int i=maxn-1;i>0;i--) if(!dp[i]) {ans=i;break;}
    	if(ans>256*256) ans=0;
    	cout<<ans<<endl;
    	return 0;
    }
    


  • 相关阅读:
    ASP.NET Web API 2 之文件下载
    Windows 查看某个端口号是否被占用
    C# 数据类型之 String(字符串)
    数据表对应关系(一对一、一对多、多对多)
    嫁给程序员的好处,你get到了吗?
    ASP.NET Web API 2 之 HttpRequestMessage 对象
    C# 使用 log4net 记录日志
    Chrome 浏览器快捷键
    C# 获取程序运行时路径
    SpringBoot整合Pagehelper分页插件
  • 原文地址:https://www.cnblogs.com/Mychael/p/8282882.html
Copyright © 2020-2023  润新知