1. 程式人生 > >藍橋杯 歷屆試題 包子湊數

藍橋杯 歷屆試題 包子湊數

公約數 整數 發現 %d 歷屆試題 stream string def 其中

問題描述

  小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有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 namespace
std; 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 }

藍橋杯 歷屆試題 包子湊數