藍橋杯 歷屆試題 包子湊數
阿新 • • 發佈:2018-05-07
公約數 整數 發現 %d 歷屆試題 stream string def 其中
每當有顧客想買X個包子,賣包子的大叔就會迅速選出若幹籠包子來,使得這若幹籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5個包子。當顧客想買11個包子時,大叔就會選2籠3個的再加1籠5個的(也可能選出1籠3個的再加2籠4個的)。
當然有時包子大叔無論如何也湊不出顧客想買的數量。比如一共有3種蒸籠,分別能放4、5和6個包子。而顧客想買7個包子時,大叔就湊不出來了。
小明想知道一共有多少種數目是包子大叔湊不出來的。 輸入格式 第一行包含一個整數N。(1 <= N <= 100)
以下N行每行包含一個整數Ai。(1 <= Ai <= 100) 輸出格式 一個整數代表答案。如果湊不出的數目有無限多個,輸出INF。 樣例輸入 2
4
5 樣例輸出 6 樣例輸入 2
4
6 樣例輸出 INF 樣例說明 對於樣例1,湊不出的數目包括:1, 2, 3, 6, 7, 11。
對於樣例2,所有奇數都湊不出來,所以有無限多個。
問題描述
小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有N種蒸籠,其中第i種蒸籠恰好能放Ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買X個包子,賣包子的大叔就會迅速選出若幹籠包子來,使得這若幹籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5個包子。當顧客想買11個包子時,大叔就會選2籠3個的再加1籠5個的(也可能選出1籠3個的再加2籠4個的)。
當然有時包子大叔無論如何也湊不出顧客想買的數量。比如一共有3種蒸籠,分別能放4、5和6個包子。而顧客想買7個包子時,大叔就湊不出來了。
小明想知道一共有多少種數目是包子大叔湊不出來的。 輸入格式 第一行包含一個整數N。(1 <= N <= 100)
以下N行每行包含一個整數Ai。(1 <= Ai <= 100) 輸出格式 一個整數代表答案。如果湊不出的數目有無限多個,輸出INF。 樣例輸入 2
4
5 樣例輸出 6 樣例輸入 2
4
6 樣例輸出 INF 樣例說明 對於樣例1,湊不出的數目包括:1, 2, 3, 6, 7, 11。
對於樣例2,所有奇數都湊不出來,所以有無限多個。
如果所有數的最大公約數不為1則有無限多數目湊不出來,即輸出INF,否則就是個01背包。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #include <set> 7 #include <map> 8 #include <math.h> 9 #define MAX_N 105 10 #define MAX_M 10050 11 #define ll long long 12 13 using namespacestd; 14 15 int n; 16 int num[MAX_N]; 17 int dp[MAX_M]; 18 int yue(int a,int b) 19 { 20 int t; 21 while(b){ 22 t = b; 23 b = a % b; 24 a = t; 25 } 26 return a; 27 } 28 int main() 29 { 30 scanf("%d",&n); 31 for(int i = 1; i <= n ;i++) 32 scanf("%d",&num[i]); 33 int ans = num[1]; 34 for(int i = 2; i <= n; i++) 35 { 36 ans = yue(ans,num[i]); 37 } 38 if(ans>1) 39 { 40 printf("INF\n"); 41 } 42 else 43 { 44 fill(dp,dp+MAX_M,0); 45 int va = 0; 46 dp[0] = 1; 47 for(int i = 1; i <= n; i++) 48 { 49 for(int j = 0; j < MAX_M; j++) 50 { 51 if(dp[j]) 52 { 53 dp[j+num[i]] = 1; 54 } 55 } 56 } 57 for(int i = 1; i < MAX_M; i++) 58 if(dp[i]==0) 59 va++; 60 printf("%d\n",va); 61 } 62 return 0; 63 }
藍橋杯 歷屆試題 包子湊數