问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成 4 颗一包和 7 颗一包的两种。糖果不能拆
包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比
如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是 17。大于 17 的任何
数字都可以用 4 和 7 组合出来。
- 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
- 两个正整数,表示每种包装中糖的颗数(都不多于 1000)
输出格式
- 一个正整数,表示最大不能买到的糖数
样例输入 1
4 7
样例输出 1
17
样例输入 2
3 5
样例输出 2
7
思路
- 包装中糖果的颗数是一定可以能卖出的组合数,则可以标记为1;能组合为1;不能组合为0;
- 当遍历array数组时,被遍历的数组值是1,则可以将array[i+a]和array[i+b]标记为1,说明改数组值可以被组合,并且count++;
- 如果遍历array数组时,被遍历的数组值是0,则需要将数值下标改变到所遍历的值下标,统计的count需要重置为0;
- 举例子:3 5包装的糖果;当数组遍历从1-2,都为0,当遍历到3时,数组值为1,则array【3+3】=array【6】=1,array【3+5】=array【8】=1,也就是相当于,一开始123456789都为0,我们赋值3 和5都为1,随着遍历后,6 和8被赋值为1,8和10赋值为1,9和11被赋值为1,因为56891011...都被赋予为1,则可以得出7为最大的不可组合值。
代码
package data;
import java.util.Scanner;
public class Data82 {
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
int a = cin.nextInt();
int b = cin.nextInt();
int max = a>b?a:b;//计算两个糖果数量的最大值;
int array[] = new int[100000];
array[a] = 1;
array[b] = 1;
int number = 0;//标记不能组合的下标;
int count = 0;//统计可以组合的连续个数;
for(int i = 1;i<array.length;i++)
{
if(array[i] == 0)
{
number = i;
count = 0;
}
else
{
array[i+a] = 1;
array[i+b] = 1;
count = count+1;
}
if(count >= max)
{
break;
}
}
System.out.println(number);
}
}