日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USACO4.12Beef McNuggets(背包+数论) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

昨天晚上寫的一題 結(jié)果USACO一直掛中 今天交了下

有一點點的數(shù)論知識? 背包很好想 就是不好確定上界

官方題解:

這是一個背包問題。一般使用動態(tài)規(guī)劃求解。

一種具體的實現(xiàn)是:用一個線性表儲存所有的節(jié)點是否可以相加得到的狀態(tài),然后每次可以通過一個可以相加得到的節(jié)點,通過加上一個輸入的數(shù)求出新的可以相加得到的點。復(fù)雜度是O(N×結(jié)果)。

但是可以證明結(jié)果不會超過最大的兩個數(shù)的最小公倍數(shù)(如果有的話)。參見數(shù)論。所以復(fù)雜度也是O(Na2),完全可以接受了。

判斷無限解可以按上面的方法,另外也可以算所有的數(shù)的最大公約數(shù)。如果不是1,也就是說這些數(shù)不互質(zhì),那么不被這個最大公約數(shù)整除的數(shù)一定構(gòu)造不出來。當且僅當這種情況會有無限解。另外有一種不需要任何數(shù)論知識的方法是判斷是不是按照每個輸入的數(shù)的循環(huán)節(jié)循環(huán),如果是的話,繼續(xù)算顯然不會有任何結(jié)果。

判斷有沒有更大的解也可以按這種方法,另外如果連續(xù)最小的數(shù)那么多個數(shù)都可以構(gòu)成,也不會有更大的符合條件的解。

通過位壓縮可以使程序在32位機上的運行速度快32倍(由于程序代碼會變長,也可能是16倍或者更小的倍數(shù))。這樣可以相當快的解決這個問題。不過復(fù)雜度還是O(Na2)。

“可以證明結(jié)果不會超過最大的兩個數(shù)的最小公倍數(shù)”。我來證明一下。

已知,不定方程 ax + by = c ( a , b > 0 且 c >= ab )存在一組整數(shù)解( x0 , y0 ) (斐蜀定理) 求證,該不定方程存在一組非負整數(shù)解 ( xn , yn ) . 證明 : 由不定方程通解式得 : xn = x0 + b * t , yn = y0 - a * t ( t 是整數(shù) ) 令 xn , yn >= 0 解出 - ( x0 / b ) <= t <= ( y0 / a ) 因為 c >= a * b 即 a * x0 + b * y0 >= a * b 兩邊同除 a * b 得 : y0 / a - ( - x0 / b ) >= 1 所以一定存在 整數(shù)t使得 - ( x0 / b ) <= t <= ( y0 / a ) . 所以方程一定有非負整數(shù)解. 證畢.

特殊情況

  • 無解的情況:很顯然,只有輸入的N個數(shù)里有1的情況才會無解,否則1本身就是一個解,因為沒辦法由更大的數(shù)相加得到。
  • 無限個解的情況,見上面的#問題分析。
  • 對于這道題目,這兩種情況都應(yīng)該輸出0。

    注:如果有兩個連續(xù)的數(shù)x,x+1 在序列中的話,那(x-1)*x以后的數(shù)都能通過這兩個相加得到。所以如果(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

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/shangyu/p/3278723.html

    總結(jié)

    以上是生活随笔為你收集整理的USACO4.12Beef McNuggets(背包+数论)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。