买不到的数目,组合问题


标题:买不到的数目

    小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出:
一个正整数,表示最大不能买到的糖数

不需要考虑无解的情况

例如:
用户输入:
4 7
程序应该输出:
17

再例如:
用户输入:
3 5
程序应该输出:
7




资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗  < 3000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。


  package 买不到的数目;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	private static ArrayList<Integer> list  = new ArrayList<Integer>();

	public static  void main(String[] args){
		//test time
		long begin = System.currentTimeMillis();
		
		//接收数据
		String[] arr = new Scanner(System.in).nextLine().split(" ");
		
		f(0,Integer.parseInt(arr[0]),Integer.parseInt(arr[1]),0);	

		int[] a = new int[list.size()];
		for(int i =0 ;i<list.size();i++){
			a[i] = list.get(i);
		}
		
		//排序
		Arrays.sort(a);

		//找出连续并显示最后的结果
		for(int i=1;i<a.length-15;i++){
			if(a[i+10]-a[i]==10){
				System.out.println(a[i]-1);
				break;
			}
		}
		
		long end = System.currentTimeMillis();
		System.out.println("运行:"+(end-begin)/1000f+"秒");
	}	

	public static void f(int base,int n ,int m,int k){
		if(k>=15){
			return;
		}
		if(!list.contains(base)){
			list.add(base);
		}
		f(base+n,n,m,k+1);
		f(base+m,n,m,k+1);
	}

}

你可能感兴趣的:(组合)