买不到的数目

题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买  10  颗糖。 
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。 
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。 
输入
两个正整数,表示每种包装中糖的颗数(都不多于1000) 
输出
一个正整数,表示最大不能买到的糖数 
样例输入
4  7 
样例输出
17

第一个代码:(正确%50) 

//不计算简单做标记
 
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000010;
int book[maxn];
int m,n;
void gcd(int x){
    if(x>1000) return;
    if(book[x]) return; 
    book[x]=1;
    x+=m;
    gcd(x);
    x-=m;
    x+=n;
    gcd(x);
} 
int main()
{
   while(cin>>m>>n){
   memset(book,0,sizeof(book));
   gcd(0);
   book[0]=0;
//   cout<<"hello"<<endl;
   for(int i=1000;i>=1;i--)
   if(!book[i]){
       if(i==0) cout<<"-1"<<endl;
    else cout<<i<<endl;
    break;}
}

}
View Code

通过累加填数这个过程我不好把控,我觉得就此鄙弃。。。

分析:联想筛选算法  直接标记(简单可控)

 

复习代码:

//不计算简单做标记
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000010;
int book[maxn];
int m,n,i,j;
int test[2];
int main()
{
   while(cin>>m>>n){
       test[0]=m;
       test[1]=n;
   memset(book,0,sizeof(book));
   book[m]=1;
   book[n]=1;
   for(i=0;i<2;i++){
       for(j=test[i]+1;j<=maxn;j++){
           if(book[j-test[i]]) book[j]=1;
       }
   }
   for(i=maxn;i>=1;i--){
       if(!book[i]) {
           cout<<i<<endl;
           break;
       }
   }
}
return 0;
}
View Code

 

posted @ 2019-03-19 11:13  Hello_World2020  阅读(191)  评论(0编辑  收藏  举报