麦香牛肉

时间限制: 1 Sec  内存限制: 128 MB

题目描述

农夫约翰的奶牛几乎要武装暴动,因为他们听说麦当劳要推出新产品麦香牛肉。奶牛们要尽力阻止这种产品的上市。他们研究了一种“劣等包装”策略。奶牛们说: “如果麦香牛肉有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行: 一个盒子里的牛肉数量。

注意,有多组数据输入

输出

输出题目中要求的单个整数。

样例输入

3
3 6 10

样例输出

17

提示

USACO 2002 Winter Orange

当第一次看到这个题目的时候,一点想法都没有。数据范围那么大,如果一个个的枚举过去,时间上肯定会暴,而且也没有实际意义。题目要求的是最大的不能买到的数量,也就是在题目提供的数据以任何方式组合都不能达到的最大数。我当时在考虑,怎么保证某一个很大数是可以通过题目提供的数据来组合。

我当时想着用一个数组存储提供数据的所有组合,但显然这样做不仅麻烦而且是错误的。

于是,在网上看了别人的说明:这是一道基本的DP题目。

// 如果输入的数据里面有 1  肯定就没有上界了;

//  如果输入的数据的最大公约数不为1,则没有上界;

//  数据最大 不会超过 max*max

有些点到目前还不是很理解,在此记录下来,以后慢慢再进行研究。以下是网上找到的数学证明:

由于数目非常庞大,不能简单进行动态规划,必须先进行数学分析缩小范围。此题进行数学抽象,给定n个正整数{an},于是有集合S={a1*x1+a2*x2+...+an*xn,xi属于N},求集合N-S 的属性,以下先从n=2 开始阐述。

引理1:S={a*x + b*y, x,y属于自然数N},当a、b 互素时,N-S为有限集,其最大值为 a*b-a-b;当a、b不互素时(a,b最大公约数大于1),则N-S 为无限集

证明:

(1) 当a、b不互素时(a,b最大公约数大于1),则N-S 为无限集

这个比较好证明,设p=gcd(a,b),则a*x+b*y必定可以写成 p*z 的形式,由于p>1,则p* z + 1必定不属于S,于是N-S 为无限集

(2) 当a、b互素时,则N-S 为有限集,且最大值为a*b-a-b

首先证明 a*b-a-b 不属于S,使用反证法,

a*b-a-b = a*x + b*y  => a*(b-1-x) = b*(1+y),由于 a、b互素,则有b-1-x>=b,这与定义矛盾,于是有a*b-a-b 必定不属于S

然后证明任何一个数z > a*b-a-b,均能表示为a*x + b*y(x,y属于N),令z=a*b-a-b+i,因为a、b互素,则i=a*m+b*n(m,n属于整数,不是自然数),于是z=a*(b-1+m) + b*(n-1),当m、n均不为负数时,z均可以表示为a*x+b*y的形式,下面证明m、n有一个为负数时的情况。

不失一般性,设i=a*x-b*y(x,y属于N),我们可以做一个变换,确保y<=a-1,当y>=a时,设y=a*r+s(s&lt;=a-1),则有i=a*x-b*(a*r+s) =a(x-br)-bs,即i表示为a*x-b*y时,可以确保y<=a-1,此时必有x>=1。

z=a*b-a-b+a*x-b*y = a(x-1) + b(a-1-y),由于 x>=1,y<=a-1,所以z可以表示,命题得证。

此命题表明S 包含大于等于ab-a-b+1的所有整数

引理2:S={a*x + b*y + c*z, x,y,z属于自然数N},当a、b、c互素时,N-S为有限集,其最大值不大于MAX(ab,ac,bc)

证明

如果其中有两个元素互素,比如gcd(a,b)=1,则由引理1得到N-S为有限集,其最大值必定不大于ab-a-b,即不大于MAX(ab,ac,bc)

假设任意两个元素均不互素,不失一般性,令ab=MAX(ab,ac,bc),p=gcd(a,b),于是有a*x+b*y+c*z=p*(a1*x+b1*y) + c*z,其中p和z互素,a1和b1互素,将a1*x+b1*y看作一个元素,运用引理1得到 N-S 的最大值为pc-p-c,但由于a1*x+b1*y从a1b1-a1-b1之后才开始连续,所以N-S的最大值必定小于pc-p-c+ p(a1b1-a1-b1) < pc + ab/p

只要证明pc + ab/p <ab即可,因为p>=2则ab/p<=ab/2,因为p<=a/2,c<b,则pc<ab/2,于是命题得证。

引理2的证明给我们提供了解决原问题的思路

定理:S={a1*x1+a2*x2+...+an*xn,xi属于N},当a1i,a2,...,an互素时,N-S的最大值小于MAX(ai) * MAX(ai)

使用数学归纳法证明,n=2,3时已经证明,假设n-1时已经证明,以下证明n时

如果其中有n-1个互素,则问题直接得证,即以下的证明为任意n-1个元素不互素的情况。不失一般性,假设n个数中a1和a2为最大的两个数,设p=gcd(a1,a2,...,an-1)

a1*x1+a2*x2+...+an*xn= p(a’1*x1+...+a’n-1*xn-1) + an*xn

根据归纳假设a’1*x1+...+a’n-1*xn-1至少从a’1a’2开始连续,且运用引理1,可以得到N-S最大值小于p an -p- an  +p(a’1 a’2) < p an+ (a1 a2)/2,利用与引理2相同的证明方法可以得到N-S的最大值小于a1a2

根据此定理,可以将原麦香牛块问题的范围限制到256*256之中,再使用动态规划求解就可行了。

原文地址:http://blog.csdn.net/wdq347/article/details/9313699

#include<bits/stdc++.h>
using namespace std;
bool a[];// 256*256
//a[i]=1表示i是能组合成的数
long long b[];
int GCD(int a, int b){
if(a % b)
return GCD(b, a%b);
else
return b;
} // 最大公约数 int main()
{
int n;
while(cin>>n)
{
bool ff=;//标记有没有出现1
int gys;
for(int i=;i<=n;i++)
{
cin>>b[i];
if(b[i]==)
{
ff=;
}
} gys=GCD(b[],b[]);
for(int i=;i<=n;i++)
{
gys=GCD(gys,b[i]);//输入数据的最大公约数
} if(ff||(gys!=))// 如果输入有1 则没有上界
{// 最大公约数>1 , 则没有上界
cout<<<<endl;
continue;
}
memset(a,,sizeof(a)); //开始dp
sort(b+,b++n);//其实不排序也没有关系
a[]=;
long long mm=b[n]*b[n];
long long ma=;
long long mi=b[];
for(long long i=mi;i<=mm;i++)
{
if(a[i]==)
{
continue;
}
for(long long j=;j<=n;j++)
{
if(i>=b[j])
{
if(a[i-b[j]]==)
{
//cout<<"已知"<<i-b[j]<<"能ok "<<i<<"也ok"<<endl;
a[i]=;
ma=max(ma,i);
}
}
}
}
//倒着找最大的不能组合成的数
bool f=;
long long kk=-;
for(long long i=mm;i>=;i--)
{
if(a[i]==)//有不能组合成的数
{
f=;
kk=i;
break;
}
}
if(f==)
{
cout<<kk<<endl;
}
else
{
cout<<<<endl;
}
} return ;
}

麦香牛肉(dp 、数论)的更多相关文章

  1. P2737 [USACO4.1]麦香牛块Beef McNuggets(完全背包+数论确定上界)

    题目链接:https://www.luogu.org/problem/show?pid=2737 题目大意:农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在 ...

  2. 洛谷 P2737 [USACO4.1]麦香牛块Beef McNuggets Label:一点点数论 && 背包

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  3. usaco training 4.1.1 麦香牛块 题解

    Beef McNuggets题解 Hubert Chen Farmer Brown's cows are up in arms, having heard that McDonalds is cons ...

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

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是"劣质的包装".& ...

  5. 洛谷P2737 [USACO4.1]麦香牛块Beef McNuggets

    P2737 [USACO4.1]麦香牛块Beef McNuggets 13通过 21提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描 ...

  6. 洛谷P3158 放棋子 [CQOI2011] dp+数论

    正解:dp+数论 解题报告: 传送门! 考虑对每种颜色的棋子单独考虑鸭,那显然有,当某一行或某一列已经被占据的时候,那一行/一列就不能再放别的颜色的棋子了,相当于直接把那一行/一列直接消了 显然就能考 ...

  7. 洛谷——P2737 [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办 ...

  8. [USACO4.1]麦香牛块Beef McNuggets By cellur925

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  9. [Luogu2737] [USACO4.1]麦香牛块Beef McNuggets

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

随机推荐

  1. (转)ORACLE中关于外键缺少索引的探讨和总结

    在ORACLE数据库中,定义外键约束时,ORACLE是不会自动创建对应索引的,必须手动在外键约束相关的列上创建索引.那么外键字段上是否有必要创建索引呢?如果有必要的话,巡检时,如何找出外键字段上没有创 ...

  2. phpstorm激活码

    激活码1 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2ln ...

  3. 异步消息处理机制相关面试问题-handler面试问题详解

    什么是handler? 这个异常应该也就是引出handler的原因,也就是默认在非UI线程中是无法去更新UI的东东滴,那到底什么上handler呢? handler通过发送和处理Message和Run ...

  4. H265码流格式

    一.H265码流格式 VPS:视频参数集,用于传输视频分级信息,有利于兼容标准在可分级视频编码或多视点视频的扩展. NALU header定义: NALU header(){ Descriptor f ...

  5. PAM安全认证模块

  6. java 面试题摘要

    5.1 什么是线程 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位, 可以使用多线程对运算提速. 5.2 线程和进程有什么区别 (1)进程是资源的分配和调度的一个独 ...

  7. 编程中易犯错误汇总:一个综合案例.md

    # 11编程中易犯错误汇总:一个综合案例 在上一篇文章中,我们学习了如何区分好的代码与坏的代码,如何写好代码.所谓光说不练假把式,在这篇文章中,我们就做一件事——一起来写代码.首先,我会先列出问题,然 ...

  8. php回顾(3)系统函数

    abs()         绝对值 ceil()         向上取整 floor()       向下取整 round()     四舍五入           第二个参数:保留小数点后面几位 ...

  9. 实现同时将一批.bmp文件转换成.mat格式

    %% 功能:实现同时对一批.bmp文件的转换成.mat格式PicFormat = {'*.bmp','Bitmap image (*.bmp)';... '*.jpg','JPEG image (*. ...

  10. Codeforces 731 F. Video Cards(前缀和)

    Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和 ...