买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成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\n",piece()); 40 return 0; 41 } 42 43 //想明白了其实思路很简单,只是我无法用代码这么清晰的表达出来。
原文:http://www.cnblogs.com/youdiankun/p/3584046.html