题目描述 小明开了一家糖果店。他别出心裁:把水果糖包成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;} } }
通过累加填数这个过程我不好把控,我觉得就此鄙弃。。。
分析:联想筛选算法 直接标记(简单可控)
复习代码:
//不计算简单做标记 #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; }