首页 > 编程语言 >【教3妹学编程-算法题】购买水果需要的最少金币数

【教3妹学编程-算法题】购买水果需要的最少金币数

时间:2023-12-07 21:32:24浏览次数:40  
标签:获得 水果 int 编程 妹学 金币 prices 免费

【教3妹学编程-算法题】购买水果需要的最少金币数_java代码

3妹:“你不是真正的快乐, 你的笑只是你穿的保护色”
2哥 : 3妹还在唱五月天的歌啊, 你不知道五月天假唱,现在全网都在骂呢。
3妹:知道啊,可是关我什么事,这个歌的确好听啊。
2哥 : 嗯嗯,不错, 还以为你是脑残粉,无论黑白都只管追星呢。
3妹:我是只管追歌的, 歌好听就行啦。
2哥 : 追哥?追哪个哥, 难道是我这个2哥~
3妹:切,谐音梗扣钱!
2哥:话说五月天演唱会的门票还挺贵的, 要上千了, 粉丝们花了钱如果听的假唱,要伤心了。3妹会花1000块购买演唱会门票吗?
3妹:当然不会!我有钱还不多买点吃的,买点水果呢。
2哥:说到购买水果,我这里有一个关于购买水果的题目,让我来考考你吧~

【教3妹学编程-算法题】购买水果需要的最少金币数_Math_02

 2题目: 

你在一个水果超市里,货架上摆满了玲琅满目的奇珍异果。

给你一个下标从 1 开始的数组 prices ,其中 prices[i] 表示你购买第 i 个水果需要花费的金币数目。

水果超市有如下促销活动:

如果你花费 price[i] 购买了水果 i ,那么接下来的 i 个水果你都可以免费获得。
注意 ,即使你 可以 免费获得水果 j ,你仍然可以花费 prices[j] 个金币去购买它以便能免费获得接下来的 j 个水果。

请你返回获得所有水果所需要的 最少 金币数。

示例 1:

输入:prices = [3,1,2]
输出:4
解释:你可以按如下方法获得所有水果:

  • 花 3 个金币购买水果 1 ,然后免费获得水果 2 。
  • 花 1 个金币购买水果 2 ,然后免费获得水果 3 。
  • 免费获得水果 3 。
    注意,虽然你可以免费获得水果 2 ,但你还是花 1 个金币去购买它,因为这样的总花费最少。
    购买所有水果需要最少花费 4 个金币。
    示例 2:

输入:prices = [1,10,1,1]
输出:2
解释:你可以按如下方法获得所有水果:

  • 花 1 个金币购买水果 1 ,然后免费获得水果 2 。
  • 免费获得水果 2 。
  • 花 1 个金币购买水果 3 ,然后免费获得水果 4 。
  • 免费获得水果 4 。
    购买所有水果需要最少花费 2 个金币。

提示:

1 <= prices.length <= 1000
1 <= prices[i] <= 10^5

 2思路: 

【教3妹学编程-算法题】购买水果需要的最少金币数_java代码_03

动态规划,寻找子问题
我们需要解决的问题是:「获得第 1 个及其后面的水果所需要的最少金币数」。

第 1 个水果一定要买,然后呢?

第 2 个水果可以购买,也可以免费获得:

如果购买,那么需要解决的问题为:「获得第 2 个及其后面的水果所需要的最少金币数」。
如果免费获得,那么需要解决的问题为:「获得第 3 个及其后面的水果所需要的最少金币数」。
无论哪种情况都会把原问题变成一个和原问题相似的、规模更小的子问题,所以可以用递归解决。

 3java代码: 

class Solution {
    public int minimumCoins(int[] prices) {
        int n = prices.length;
        int[] memo = new int[(n + 1) / 2];
        return dfs(1, prices, memo);
    }


    private int dfs(int i, int[] prices, int[] memo) {
        if (i * 2 >= prices.length) {
            return prices[i - 1]; // i 从 1 开始
        }
        if (memo[i] != 0) { // 之前算过
            return memo[i];
        }
        int res = Integer.MAX_VALUE;
        for (int j = i + 1; j <= i * 2 + 1; j++) {
            res = Math.min(res, dfs(j, prices, memo));
        }
        return memo[i] = res + prices[i - 1]; // 记忆化
    }
}


标签:获得,水果,int,编程,妹学,金币,prices,免费
From: https://blog.51cto.com/u_6813689/8727938

相关文章

  • 《Java编程思想第四版》学习笔记45--关于图标
    //:Faces.java//IconbehaviorinJButtonspackagec13.swing;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassFacesextendsJPanel{staticIcon[]faces={newImageIcon("face0.gif"),......
  • 探索正则可视化工具:让编程更直观、高效
    导语:在当今的编程世界中,正则表达式已成为不可或缺的技能。然而,理解和编写正则表达式往往是一项具有挑战性的任务。为了降低门槛,提高编程效率,正则可视化工具应运而生。一、正则表达式的简介与历史正则表达式(RegularExpression,简称:Regex)是一种强大的文本处理工具,其最早的雏形可......
  • 实验四 Web服务器1-socket编程
    实验四Web服务器1-socket编程基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:1.time服务器的客户端服务器,提交程序运行截图2.echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid你的学号姓名echo:”返回给客户端3.......
  • 实验四 Web服务器1-socket编程
    time服务器time客户端echo服务器echo客户端......
  • 响应式编程又变天了?看JDK21虚拟线程如何颠覆!
    本文解释为啥会有响应式编程,为什么它在开发者中不太受欢迎,以及引入Java虚拟线程后它可能最终会消失。命令式风格编程一直深受开发者喜爱,如if-then-else、while循环、函数和代码块等结构使代码易理解、调试,异常易追踪。然而,像所有好的东西一样,通常也有问题。这种编程风格导致......
  • 实验四 Web服务器1-socket编程
    基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:1.time服务器的客户端服务器,提交程序运行截图3.服务器部署到华为云服务器,客户端用Ubuntu虚拟机。time服务器代码(tms.c)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include......
  • 实验四 Web服务器1-socket编程
    基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:1.time服务器的客户端服务器,提交程序运行截图2.echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid你的学号姓名echo:”返回给客户端3.服务器部署到华为云服务器,客户端......
  • ARM架构与编程--基于STM32F103 (1)LED原理图
    ARM架构与编程--基于STM32F103--(1)LED原理图--前言学习笔记《硬件知识_LED原理图》一、点亮一个led的步骤当我们学习C语言的时候,我们会写个Hello程序。那当我们写ARM程序,也该有一个简单的程序引领我们入门,这个程序就是点亮LED。我们怎样去点亮一个LED呢?分为三步:1.看原理图,确......
  • NOIP2015普及组金币
    NOIP2015普及组金币题目数据(n<=10000)根据题目要求与我们原来学过的打印数字三角形图形很相似。数字三角形如下,数字可以对应成天数:12 34  5  67  8  9  10每天加的金币就是行坐标即可:12  23  3  34  4  4  4代码如何:#includ......
  • 上机编程字典序排序总结
    1         字典序概念2021-0319上机编程认证的入门级&工作级第二题-可漫游服务区,输出结果要求字符串按照字典序降序排序,本文对各编程语言字典序排序方法做一个总结。题目描述漫游(roaming)是一种移动电话业务,指移动终端离开自己注册登记的服务区,移动到另一服务区(地区或......