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.pswp.cn/news/274069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274069.shtml
英文地址,請注明出處:http://en.pswp.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();…

Epoll模型詳解

轉自http://blog.163.com/huchengsz126/blog/static/73483745201181824629285/ Linux 2.6內核中提高網絡I/O性能的新方法-epoll I/O多路復用技術在比較多的TCP網絡服務器中有使用&#xff0c;即比較多的用到select函數。 1、為什么select落后 首先&#xff0c;在Linux內核中…

運算放大器單電源應用中的使用齊納二極管偏置方法

運算放大器單電源應用中的偏置方法除了使用大電阻使運放輸出達到電源電壓的一半外&#xff0c;還有使用齊納二極管&#xff08;穩壓管&#xff09;方法也能得到達到應用目的。 下面就推薦幾個齊納二極管&#xff08;分別對應著電源電壓是15V,12V&#xff0c;9V;5V&#xff09; …

Java——demo之仿ATM操作

java.util.Scanner類&#xff0c;這是一個用于掃描輸入文本的新的實用程序。其中nextInt()獲取String型&#xff0c;而next()獲取int、double型。這是一個仿ATM的小程序。 實現條件 1.登陸界面&#xff0c;2.三次登陸機會&#xff0c;登陸成功進入登陸菜單&#xff0c;3&#x…

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…

Ninject使用demo

public class HomeController : Controller{public ActionResult Index(){ //核心對象IKernel ninjectKernel new StandardKernel();ninjectKernel.Bind<IValueCaculator>().To<LinqValueCalcalator>(); //方案1&#xff1a;獲取接口實例IV…

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接口繼…

winform錯誤提示 :窗口類名無效(Window class name is not valid)

winfrom 程序在 xp 操作系統上報錯提示 窗口類名無效(Window class name is not valid) 解決方法 注釋 Program類 里 這句 Application.EnableVisualStyles(); 解決轉載于:https://www.cnblogs.com/z_lb/p/3288850.html

如何在linux下通過ssh運行X圖形軟件

服務器端&#xff1a;編輯/etc/ssh/sshd_config中的以下內容 啟用AllowTcpForwarding 啟用X11Forwarding 將X11DisplayOffset設定為10. 啟用X11UseLocalhost 客戶機端&#xff1a;編輯/etc/ssh/ssh_config中的以下內容 啟用X11Forwarding 連接時ssh -X或者ssh -Y就可以了…

Java Set集合

Set接口什么是Set&#xff0c;就是不包含重復元素的集合。Set是一種不包括重復元素的Collection。它維持它自己的內部排序&#xff0c;所以隨機訪問沒有任何意義。與List一樣&#xff0c;它同樣允許null的存在但是僅有一個。由于Set接口的特殊性&#xff0c;所有傳入Set集合中的…

linux下制作win7安裝U盤

轉自:http://blog.csdn.net/pipisorry/article/details/41369821 http://blog.csdn.net/pipisorry/article/details/41369821 已裝Linux&#xff0c;再用U盤安裝win7(網絡安裝應該也可以)&#xff0c; 先要在linux里面制作一個win7安裝U盤&#xff08;windows下用ultraiso制…

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文檔其…

Collection 和 Collections區別

Collection 和 Collections區別&#xff08;1&#xff09;java.util.Collection 是一個集合接口&#xff08;集合類的一個頂級接口&#xff09;。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具…

Http狀態碼完整說明

在網站建設的實際應用中&#xff0c;容易出現很多小小的失誤&#xff0c;就像mysql當初優化不到位&#xff0c;影響整體網站的瀏覽效果一樣&#xff0c;其實&#xff0c;網站的常規http狀態碼的表現也是一樣&#xff0c; 一些常見的狀態碼為&#xff1a; 200 - 服務器成功返回網…

運用xlib進行事件響應(X11 API)的小例子

轉自&#xff1a;http://blog.csdn.net/linuxheik/article/details/7659090 File: x11_test.cxx #include <X11/Xlib.h> 每一個Xlib 程序都必須包含這個頭文件 #include <stdio.h>1. int main(void) {2. Display *display XopenDisplay(NULL);首先打開與server …

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會在識別元素標…