买不到的数目

1
2
3
4
5
6
7
8
9
10
11
12
13
题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成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 @   Hello_World2020  阅读(194)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示