历届试题 买不到的数目

/*历届试题 买不到的数目  
时间限制:1.0s   内存限制:256.0MB
      
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

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

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

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

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

输出格式
一个正整数,表示最大不能买到的糖数

样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7*/

1.用队列的思想

  • 我的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static int n,m;
    public static int a[][] ;
    public static ArrayList<Integer> al = new ArrayList<>();
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        n = sca.nextInt();
        m = sca.nextInt();
        a = new int[n + 1][ m + 1];
        int sum = 0;
        int max;
        if(n < m) {
            max = n;
        }
        else {
            max = m;
        }
        for(int i = 0;i <= m;i ++) {
            for(int j = 0;j <= n; j ++) {
                al.add(n * i + m * j);
        //        System.out.println(al);
            }
        }
            int t = al.size();
         int at[] = new int[al.size()];
         for(int i = 0;i < t;i ++) {
             at[i] = al.get(i);
         }
         Arrays.sort( at);
       /*  for(int x:at) {
             System.out.println(x);
         }*/
         for(int i = max ; i <= n * m; i ++) {
             if(at[i + max -1] == at[i] + max - 1) {
                 System.out.println(at[i] - 1);
                 break;
             }
         }
    }

}
  • 解题思路:当出现(max)m,n中的一个最小数个连续的数可以买到时,后面所有情况都可以买到。所以在此数之前的一个数就是最大买不到数目
  • 时间空间花费:

 2.优化的动态规划方法:

  • 我的代码 
/**
*@author 杨雨婷
*@date 2019年5月9日
*/
package 买不到的数目;

import java.util.Scanner;

public class Main2 {
	static int a[];
	static int n,m;
    
	public static void main(String[] args) {
		Scanner sca = new Scanner(System.in);
		n = sca.nextInt();
		m = sca.nextInt();
		
		int min = min(n, m);
		int mn = n * m;
		a = new int[mn + 1];
		//标记
		for(int i = 0; i < m; i ++) {
			for(int j = 0; j < n; j ++) {
				int t = n * i + m * j;
				if(t <= n * m) {
					a[t] = 1;
				}
			}
		}
		//连续出现min个可以实现的数就结束
		int t = min;
		int num = 0;
		for(int i = 0; i <= mn; i ++) {
			//System.out.println(i + ":" + a[i]);
			 if(a[i] == 1) {
				 num ++;
				 if(num == min) {
					 System.out.println(t);
					 return;
				 }
			 }
			 else {
				 num = 0;
				 t = i;
			 }
		}
		

	}

	private static int min(int n2, int m2) {
		if(n2 > m2) {
			return m2;
		}
		return n2;
	}

}
  • 测试结果:

23 34
725

 

  • 时间空间花费:

 3.看清题目可知,包装的糖果最大为1000,所以可以直接开空间为10001.就更简化了思路

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值