zoukankan      html  css  js  c++  java
  • 蓝桥杯 历届试题 包子凑数

    问题描述

      小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有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
    ");
    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
    ",va);
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码
    SQL——触发器——插入触发器——边学边项目写的。
    SQL链表查询 数据库为空
    【错误积累】更新失败,数据包解压时出现错误!
    VS使用技巧(转)
    命令模式
    代理模式
    模板方法模式
    享元模式
    MongoDB 分片2
  • 原文地址:https://www.cnblogs.com/Xycdada/p/9000123.html
Copyright © 2011-2022 走看看