题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
题解:
题目需要求a,b所不能组合的最大数字,该数字后面的所有数都能够被a,b组合得到。
假设该数字为c,c后面的数都能被a,b组合的条件就是c后的min{a, b}个数都能被组合。原因如下:
假设有a、b,且a < b
数字c是a、b不能组合的最大的数。且c+1、c+2、… … 、c+a都能被组合。
则可推出(c+a)+1 = (c+1)+a
(c+a)+2 = (c+2)+a
(c+a)+3 = (c+3)+a
… …
那么如何求c呢,易知当m可被组合时,m+a、m+b也可被组合,可以被组合的数字做上标记,遍历下去同时标记最后一个不能被组合的数,当其后面出现了min{a, b}个可以被组合的数时,该数就是所求的c。
代码:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[] arr = new int[1000000];
Arrays.fill(arr, 0);
int min = Math.min(m, n);
arr[m] = 1;
arr[n] = 1;
int index = 0; // 标记最后一个不能被组合的数
int num = 0; // 记录arr[index]后连续可被组合数的个数
for (int i = 0; i < 9999999; i++) {
if (arr[i] == 0) {
index = i;
num = 0;
} else {
arr[i + m] = 1;
arr[i + n] = 1;
num++;
}
if (num >= min) {
break;
}
}
System.out.println(index);
}