zoukankan      html  css  js  c++  java
  • 算法笔记_095:蓝桥杯练习 拿糖果(Java)

    目录

    1 问题描述

    2 解决方案

     


    1 问题描述

    问题描述
      妈妈给小B买了N块糖!但是她不允许小B直接吃掉。
      假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数。这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖。然后小B就可以接着拿糖。
      现在小B希望知道最多可以拿多少糖。
    输入格式
      一个整数N
    输出格式
      最多可以拿多少糖
    样例输入
    15
    样例输出
    6
    数据规模和约定
      N <= 100000

     


    2 解决方案

    刚开始做的时候,使用的贪心法,每次选择剩余糖果总数开平方根里最大的质因数,最终评分为70分,有6组数据运行错误。

    后来,查看了网友答案,此题要使用动态规划法才能得到最佳解。

    动态转换方程为:dp[i] = max{dp[i], dp[i - prime * 2] + prime}

     

    具体代码如下:

    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Main {
        
        public boolean judgePrime(int n) {
            if(n == 2)
                return true;
            for(int i = 2;i <= n;i++) {
                if(n % i == 0)
                    return false;
                if(i > n / 2)
                    break;
            }
            return true;
        }
        //获取n的平方根以内的所有质因数
        public ArrayList<Integer> getPrime(int n) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            n = (int) Math.sqrt(n);
            for(int i = 2;i <= n;i++) {
                if(judgePrime(i)) {
                        list.add(i);
                }
            }
            return list;
        }
        
        public void printResult(int n) {
            int[] dp = new int[100005];
            ArrayList<Integer> list = getPrime(100005);
            int len = list.size();
            int judge, prime;
            for(int i = 1;i <= n;i++) {
                judge = (int) Math.sqrt(i);
                for(int j = 0;j < len;j++) {
                    prime = list.get(j);
                    if(prime > judge)
                        break;
                    if(judge % prime == 0) {
                        if(dp[i] < dp[i - prime * 2] + prime)
                            dp[i] = dp[i - prime * 2] + prime;
                    }
                }
            }
            System.out.println(dp[n]);
            return;
        }
        
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            test.printResult(n);
        }
    }
  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6576498.html
Copyright © 2011-2022 走看看