USACO4.12Beef McNuggets(背包+数论)

昨天晚上写的一题 结果USACO一直挂中 今天交了下

有一点点的数论知识  背包很好想 就是不好确定上界

官方题解:

这是一个背包问题。一般使用动态规划求解。

一种具体的实现是:用一个线性表储存所有的节点是否可以相加得到的状态,然后每次可以通过一个可以相加得到的节点,通过加上一个输入的数求出新的可以相加得到的点。复杂度是O(N×结果)。

但是可以证明结果不会超过最大的两个数的最小公倍数(如果有的话)。参见数论。所以复杂度也是O(Na2),完全可以接受了。

判断无限解可以按上面的方法,另外也可以算所有的数的最大公约数。如果不是1,也就是说这些数不互质,那么不被这个最大公约数整除的数一定构造不出来。当且仅当这种情况会有无限解。另外有一种不需要任何数论知识的方法是判断是不是按照每个输入的数的循环节循环,如果是的话,继续算显然不会有任何结果。

判断有没有更大的解也可以按这种方法,另外如果连续最小的数那么多个数都可以构成,也不会有更大的符合条件的解。

通过位压缩可以使程序在32位机上的运行速度快32倍(由于程序代码会变长,也可能是16倍或者更小的倍数)。这样可以相当快的解决这个问题。不过复杂度还是O(Na2)。

“可以证明结果不会超过最大的两个数的最小公倍数”。我来证明一下。

已知,不定方程 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 ) .
所以方程一定有非负整数解. 证毕.

特殊情况

  1. 无解的情况:很显然,只有输入的N个数里有1的情况才会无解,否则1本身就是一个解,因为没办法由更大的数相加得到。
  2. 无限个解的情况,见上面的#问题分析。

对于这道题目,这两种情况都应该输出0

注:如果有两个连续的数x,x+1 在序列中的话,那(x-1)*x以后的数都能通过这两个相加得到。所以如果(x-1)*x前无解,则无解!

 1 /*
 2     ID: shangca2
 3     LANG: C++
 4     TASK: nuggets
 5  */
 6 
 7 #include <iostream>
 8 #include<cstdio>
 9 #include<cstring>
10 #include<algorithm>
11 #include<stdlib.h>
12 using namespace std;
13 #define N 70000
14 int dp[70010];
15 int a[12];
16 int gcd(int a,int b)
17 {
18     return b==0?a:(gcd(b,a%b));
19 }
20 int main()
21 {
22     freopen("nuggets.in","r",stdin);
23     freopen("nuggets.out","w",stdout);
24     int i,j,n,y;
25     cin>>n;
26     for(i = 1; i <= n ; i++)
27     cin>>a[i];
28     y = a[1];
29     if(n==1)
30     {
31         printf("0\n");
32         return 0;
33     }
34     for(i = 2; i <= n ; i++)
35     {
36         y = gcd(y,a[i]);
37     }
38     if(y!=1)
39     {
40         puts("0");
41         return 0;
42     }
43     int v = N;
44     dp[0] = 1;
45     for(j = 1; j <= n ; j++)
46         for(i = a[j] ; i <= v ; i++)
47             {
48                 dp[i] = max(dp[i],dp[i-a[j]]);
49             }
50     for(i = v ; i>=1 ; i--)
51     {
52         if(dp[i]==0)
53         break;
54     }
55     if(i==0)
56     cout<<"0\n";
57     else
58     cout<<i<<endl;
59     return 0;
60 }
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3278723.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 循环语句中 break,continue,return有什么区别?

break 结束循环&#xff0c;跳出循环体,进行后面的程序;continue 结束本次循环&#xff0c;进行下次循环;return 跳出循环体所在的方法&#xff0c;相当于结束该方法; 例子&#xff1a; public class whiletrueTest{public static void main(String[] args) {heihei();haha();…

运算放大器单电源应用中的使用齐纳二极管偏置方法

运算放大器单电源应用中的偏置方法除了使用大电阻使运放输出达到电源电压的一半外&#xff0c;还有使用齐纳二极管&#xff08;稳压管&#xff09;方法也能得到达到应用目的。 下面就推荐几个齐纳二极管&#xff08;分别对应着电源电压是15V,12V&#xff0c;9V;5V&#xff09; …

dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算

本文转自&#xff1a;http://www.cnblogs.com/yaozhongxiao/archive/2014/07/14/3842908.html 一、基本概念 dip &#xff1a; Density independent pixels &#xff0c;设备无关像素。 dp &#xff1a;就是dip px &#xff1a; 像素 dpi &#xf…

Java 集合中关于Iterator 和ListIterator的详解

1.Iterator Iterator的定义如下&#xff1a;public interface Iterator<E> {}Iterator是一个接口&#xff0c;它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下&#xff1a;forEachRemaining(Consumer<? super E> action)&a…

使用xrandr和cvt命令添加自定义的分辨率模式

可以使用xrandr -q命令查看当前支持的分辨率模式: 如果过没有你想要的分辨率模式,则需要自己创建新的分辨率模式,例如,我想要创建800x750的分辨率模式,步骤如下: 1.使用cvt命令创建新的分辨率: 2.使用xrandr –newmode modeline信息(CVT命令产生的结果)创建新的mode: $xra…

Java List集合

我们先看一下jdk1.9对其的描述&#xff1a;什么是List&#xff0c;也就是一个有序集合(序列)。1.List接口 List集合代表一个有序集合&#xff0c;集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。 List接口继…

Java Set集合

Set接口什么是Set&#xff0c;就是不包含重复元素的集合。Set是一种不包括重复元素的Collection。它维持它自己的内部排序&#xff0c;所以随机访问没有任何意义。与List一样&#xff0c;它同样允许null的存在但是仅有一个。由于Set接口的特殊性&#xff0c;所有传入Set集合中的…

Java Map集合

Map集合&#xff1a;Map接口Map与List、Set接口不同&#xff0c;它是由一系列键值对组成的集合&#xff0c;提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value&#xff0c;所以它不能存在相同的…

gsettings命令使用简介

1.gsettings创建项 应用程序可以使用gsettings来保存配置信息&#xff0c;可以通过代码在程序中进行设置、修改gsettings的已有的项&#xff0c;但是不能通过程序代码创建新的gsettings项&#xff0c;gsettings的项的在一个叫做schema的规范文件中创建&#xff0c;schema文档其…

Java 之HashSet、LinkedHashSet、TreeSet比较

4.HashSet、LinkedHashSet、TreeSet比较 Set接口Set不允许包含相同的元素&#xff0c;如果试图把两个相同元素加入同一个集合中&#xff0c;add方法返回false。Set判断两个对象相同不是使用运算符&#xff0c;而是根据equals方法。也就是说&#xff0c;只要两个对象用equals方法…

jquery1.9学习笔记 之选择器(基本元素四)

ID选择器("#id") 描述&#xff1a; 选择与给出ID属性匹配的单元标签。 对于ID选择器&#xff0c;jquery使用JS的函数document.getElementById()&#xff0c;当一个标签附加到ID选择器上时&#xff0c;也是非常有效的。如h2#pageTitle&#xff0c;jquery会在识别元素标…

Java(ArrayList和LinkedList)、(HashTable与HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比较)

1.ArrayList和LinkedList &#xff08;1&#xff09;ArrayList是实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构。 &#xff08;2&#xff09;对于随机访问get和set&#xff0c;ArrayList绝对优于LinkedList&#xff0c;因为LinkedList要移动指针。 &a…

Java 集合之自动打包和解包以及泛型

自动打包与解包&#xff1a;泛型&#xff1a;上栗子&#xff1a; TestMap1.java: package com.zhj.www; import java.util.*;public class TestMap {public static void main(String[] args) {Map m1 new HashMap();Map m2 new TreeMap();//m1.put("one", new Inte…

泗洪高薪行业

泗洪高薪行业转载于:https://www.cnblogs.com/soundcode/p/3302297.html

Java IO 节点流与处理流类型

处理流类型&#xff1a;1、处理流之首先缓冲流&#xff1a;解释&#xff1a;例子&#xff1a;TestBufferStream1.java package com.zhj.www;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException;public class TestBufferStream1 …

高级浏览器-SRWare Iron 29.0.1600.0 版本发布

SRWare Iron是德国一安全公司srware改造的Chrome&#xff08;铬&#xff09;命名为铁&#xff08;iron&#xff09;的浏览器。于2008年9月18日首次发布。 据官方介绍&#xff0c;Iron浏览器砍掉了Chromium原程序中的很多有碍“隐私”问题的代码。 “iron中去除的功能包括&#…

Java 线程多线程编程1---基础

1、线程的基本概念例子&#xff1a;分析&#xff1a;2、线程的创建和启动第一种线程的创建&#xff1a;定义一个线程类来实现Runner接口 例子&#xff1a; package com.zhj.www; import java.lang.Thread; public class TestThread1 {public static void main(String[] args) {…

windows挂载linux网络文件系统NFS

ubuntu上安装配置nfs服务 #apt-get install nfs-kernel-server #mkdir /home/nfs #vim /etc/exports 在文档的最后一行加入/home/nfs *(rw,sync,no_root_squash,no_subtree_check)&#xff0c;保存退出。 #/etc/init.d/rpcbind restart 重启rpcbind #/etc/init.d/nfs-kern…

SQL的连接分为三种:内连接、外连接、交叉连接。

先给出两张表&#xff1a;一、内连接&#xff1a;内连接&#xff08;INNER JOIN&#xff09;&#xff1a;有两种&#xff0c;显式的和隐式的&#xff0c;返回连接表中符合连接条件和查询条件的数据行。&#xff08;所谓的链接表就是数据库在做查询形成的中间表&#xff09;。1、…

RTP与RTCP协议介绍

本文转自&#xff1a;http://blog.51cto.com/zhangjunhd/25481 1&#xff0e;流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物。术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身…