蓝桥杯-买不到的数目

买不到的数目

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入: 两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出: 一个正整数,表示最大不能买到的糖数

例如: 用户输入: 4 7 程序应该输出: 17

再例如: 用户输入: 3 5 程序应该输出: 7

 

看到这道题无从下手,不知道怎么做,看了别人的代码,还想了一个小时。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 #define maxn 1000001
 6 int a[maxn];
 7 int x,y;
 8 
 9 int piece()
10 {
11     int i;
12     memset(a,0,sizeof(a));
13     cin>>x>>y;
14     a[0]=1;
15     for(i=1;i<maxn;i++)
16     {
17         if(i>=x&&a[i-x])  //其实就用一个大数组存储,比如x=4,y=7,由a[0]=1先让a[4]=1,a[7]=1,在一点点拼凑,将
18         {
19             a[i]=1;      //所有可能的值都置成1     
20         }
21         else if(i>=y&&a[i-y])
22         {
23             a[i]=1;
24         }
25     }
26     int s=0;
27     for(i=1;i<maxn;i++)
28     {
29         if(i>s&&!a[i])
30         {
31             s=i;    //从而找到不可能的最大值
32         }
33     }
34     return s;
35 }
36 
37 int main()
38 {
39     printf("%d
",piece());
40     return 0;
41 }
42 
43 //想明白了其实思路很简单,只是我无法用代码这么清晰的表达出来。
原文地址:https://www.cnblogs.com/youdiankun/p/3584046.html