zoukankan      html  css  js  c++  java
  • 历届试题 买不到的数目

    题目

    问题描述

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

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

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

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

    输入格式

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

    输出格式

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

    样例输入1

    4 7

    样例输出1

    17

    样例输入2

    3 5

    样例输出2

    7


    思路:

    最开始找不着上界,写了个dfs,33分。
    然后上界用 两个数的最小公倍数(其实开始用的两数乘,后来想了下。。。)
    完全背包里 从 最小公倍数-1 倒着找就出来了。


    代码

    import java.util.*;
    import java.math.*;
    import java.util.regex.*;
    
    
    public class Main {
    
        final static int INF = 0x3f3f3f3f;
        final static int NUM = 1002;
    
        static int gcd(int a,int b) {
            int t;
            while(b!=0) { 
                t=a%b;a=b;b=t;
            }
            return a; 
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int[] a=new int[2];
            while(sc.hasNext()) {
                a[0]=sc.nextInt();a[1]=sc.nextInt();
                int maxn=a[0]*a[1]/gcd(a[0],a[1]);
                int[] f=new int[maxn];
                TreeSet<Integer> ts=new TreeSet<Integer>();
                for(int i=0;i<2;i++) {
                    for(int j=a[i];j<f.length;j++) {
                        f[j]=Math.max(f[j], f[j-a[i]]+a[i]);
                        ts.add(f[j]);
                    }
                }
    
                int ans=maxn-1;
                for(int i=0;i<NUM;i++) {
                    if(!ts.contains(ans))break;
                    ans--;
                }
                System.out.println(ans);
            }
    
        }
    }
    
    
  • 相关阅读:
    博客美化
    hello world
    mysql数据库索引
    Golang:线程 和 协程 的区别
    计算机网络详解
    Redis持久化机制
    nginx 详解
    多级缓存的分层架构
    svn忽略文件不提交至服务器的方法
    Mysql 事务及其原理
  • 原文地址:https://www.cnblogs.com/wygdove/p/4542095.html
Copyright © 2011-2022 走看看