【算法作业】均分卡牌,购买股票

问题描述

  1. John 有两个孩子,在 John病逝后,留下了一组价值不一定相同的魔卡, 现在要求你设计一种策略,帮John的经管人将John的这些遗产分给他的两个孩子,使得他们获得的遗产差异最小(每张魔卡不能分拆)。

  2. 假设已知某股票连续若干天的股价,并且如何时候你手上只能由一支股票,即如果你要买入就得先将手上股票卖出,设计一个算法来计算你所能获取的最大利润。你最多可以完成 k笔交易。也就是说,你最多可以买k 次,卖 k 次。

    输入:k = 2, prices = [3,2,7,5,1,4]
    输出:8
    
    7-2  +  4-1
    

解题思路

T1

这是一个经典的贪心算法问题:

  1. 将所有的魔卡按照价值从大到小排序。
  2. 从价值最高的魔卡开始,依次分配给两个孩子中当前遗产较少的那个孩子。
  3. 重复步骤2直到所有的魔卡都被分配完毕。

这种贪心分东西的思路非常常见,一眼望穿

类似的题目还有捡大小垃圾放两个垃圾袋呀等等。

T2

那么这道题到底是贪心还是动规呢?

我们知道动规有一道经典例题,就是非升子序列,不觉得这题有几分相似,都是必须从前往后求最优。其实要证明贪心算法不行只要举个反例就行了。

于是就根据经验按照动规的思路来思考。考虑使用二维数组dp[i][j],代表当前状态的最大利润,i代表当前是第i次买卖,j代表当前是第j天。

对于每个状态都有买和不买。为什么是买和不买呢,不是还有卖吗?其实是赚钱和不赚钱这两种选择,赚钱是卖与买之间的差值。所以这道题比一般的动态规划要更复杂些。

对于每一次买卖,必须有买才有卖,先用maxDiff包括因为买股票亏的钱,一开始由于没有股票,就等于-prices[1]。这个亏的钱也完全不是负数亏的钱,还要包括之前(上一次买卖)因为赚钱累计的成本,这个maxDiff就是代表本次买卖状态下的累计成本(比较难理解)。所以 m a x D i f f = m a x ( m a x D i f f , d p [ i − 1 ] [ j ] − p r i c e s [ j ] ) maxDiff = max(maxDiff, dp[i-1][j] - prices[j]) maxDiff=max(maxDiff,dp[i1][j]prices[j])

对于每一天,都有去赚钱和不赚钱。不赚钱利润等于昨天的利润,去赚钱的利润等于累计成本maxDiff加上prices[j],因此 d p [ i ] [ j ] = m a x ( d p [ i ] [ j − 1 ] , p r i c e s [ j ] + m a x D i f f ) dp[i][j] = max(dp[i][j-1], prices[j] + maxDiff) dp[i][j]=max(dp[i][j1],prices[j]+maxDiff)

在样例下,dp运算结果如下所示。

prices327514
dp[1][j]005555
dp[2][j]005558

这个dp[k][n]就是answer。

完整代码

T1

#include <iostream>
#include <algorithm>

using namespace std;

// 分配遗产的函数
void distributeInheritance(int cards[], int n) {
    // 排序魔卡
    sort(cards, cards + n, greater<int>());

    // 初始化两个孩子的遗产值
    int child1_inheritance = 0;
    int child2_inheritance = 0;

    // 分配遗产
    for (int i = 0; i < n; ++i) {
        if (child1_inheritance <= child2_inheritance) {
            child1_inheritance += cards[i];
        } else {
            child2_inheritance += cards[i];
        }
    }

    // 输出两个孩子的遗产差异
    cout << "遗产差异最小为:" << abs(child1_inheritance - child2_inheritance) << endl;
}

int main() {
    // 输入魔卡数量
    int n;
    cout << "请输入魔卡数量:";
    cin >> n;

    // 输入每张魔卡的价值
    int cards[n];
    cout << "请输入每张魔卡的价值:" << endl;
    for (int i = 0; i < n; ++i) {
        cin >> cards[i];
    }

    // 调用分配遗产函数
    distributeInheritance(cards, n);

    return 0;
}

/* sample input
8 
2 5 6 7 1 7 4 3
*/

输出结果

请输入魔卡数量:8
请输入每张魔卡的价值:
2 5 6 7 1 7 4 3
遗产差异最小为:1

T2

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k,prices[100],dp[101][101]; // 动态规划数组大小修改为dp[101][101]
    cin>>n>>k;
    memset(dp,0,sizeof(dp));
    memset(prices,0,sizeof(prices));
    for(int i=1;i<=n;i++)
        cin>>prices[i];
    for(int i=1;i<=k;i++){
        int maxDiff = -prices[1]; // 数组prices的下标从1开始
        for(int j=1;j<=n;j++){ 
            dp[i][j] = max(dp[i][j-1],prices[j] + maxDiff);
            maxDiff = max(maxDiff, dp[i-1][j] - prices[j]);
        }
    }
    cout<<dp[k][n]<<endl;

    // 打印dp数组
    cout<<"|dp|";
    for(int i=1;i<=n;i++)
        cout<<i<<"|";
    cout<<endl;
    cout<<"|";
    for(int i=1;i<=n+1;i++)
        cout<<"-|";
    cout<<endl;
    for(int i=1;i<=k;i++){
        cout<<"|"<<i<<"|";
        for(int j=1;j<=n;j++)
            cout<<dp[i][j]<<"|";
        cout<<"\n";
    }
    return 0;
}

/* simple input
6 2
3 2 7 5 1 4
*/

输出结果

6 2
3 2 7 5 1 4
8
|dp|1|2|3|4|5|6|
|-|-|-|-|-|-|-|
|1|0|0|5|5|5|5|
|2|0|0|5|5|5|8|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/602400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化校园的发展阶段

现代化技能虽然能很大程度上给人们日子带来很大的便利&#xff0c;可是许多新兴的科技被人们所接纳需求一个按部就班的进程。数字化学校也是如此。把高新科技引入到学校中&#xff0c;完全推翻之前的教育形式&#xff0c;关于学校来说也是一个巨大的挑战。所以数字化学校也不可…

怿星 × NI丨联合成功打造行业领先的L4自动驾驶数据回灌系统

怿星NI 联合成功打造行业领先的L4自动驾驶数据回灌系统&#xff08;终版&#xff09; 怿星与于NI&#xff08;恩艾&#xff09;公司联合打造的L4自动驾驶数据回灌系统&#xff0c;在支持多种数据同步回灌、实时模拟故障、高带宽数据传输的同时&#xff0c;具有视频链路扩展性高…

2024年钉钉群直播回放怎么保存

钉钉群直播回放下载插件我已经打包好了&#xff0c;有需要的自己下载一下 小白钉钉工具打包链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.再把逍遥一仙下载器解压出来&#xff0…

护眼台灯什么牌子好一点?五款专业护眼灯品牌排行分享

台灯作为家庭中不可或缺的桌面照明设备&#xff0c;在儿童和青少年的学习生活中扮演着至关重要的角色。对于这个年龄段的孩子来说&#xff0c;台灯的选择尤为关键&#xff0c;因为不恰当的照明可能对他们娇嫩的视力造成损害。护眼台灯什么牌子好一点&#xff1f;家长们在挑选台…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限&#xff0c;您可以使用SHOW GRANTS语句。这将列出用户的权限&#xff0c;包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令&#xff1a; SHOW GRANTS; 如果您想查看特定用户的权限&#xff0c;可以使用以下命令&…

delphi6直连redis服务(用lua脚本redis模块)

一、创建一个exe程序 创建一个exe程序,引用LuaRedis.pas单元(此单元自己封装的代码,目前主要封装了获取key和设置key/value功能),代码如下: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;type…

仅为娱乐,Python中如何重定义True为False?

在Python中&#xff0c;True 和 False 是内建的布尔常量&#xff0c;分别代表逻辑上的真和假。它们是不可变的&#xff0c;且在Python语言规范中具有特殊地位&#xff0c;不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的&#xff0c;这样的操作会…

​在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理

在缺少标注数据场景&#xff0c;SetFit 是解决的建模问题的一个有前途的解决方案&#xff0c;其由 Hugging Face 与Intel 实验室以及UKP Lab合作共同开发。作为一个高效的框架&#xff0c;SetFit 可用于对Sentence Transformers模型进行少样本微调。 SetFit 仅需很少的标注数据…

【JavaEE精炼宝库】计算机是如何工作的

目录 前言&#xff1a; 一、冯诺依曼体系 二、CPU基本知识 2.1 硬盘|内存|CPU关系&#xff1a; 2.2 指令&#xff1a; 2.3 CPU是如何执行指令的&#xff08;重点&#xff09;&#xff1a; 2.4 小结&#xff1a; 三、编程语言 3.1 程序&#xff1a; 3.2 编程语言发展&a…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖&#xff0c;单号收益300左右&#xff0c;多开收益更多&#xff0c;轻松日入1000 可矩阵操作。 项目长期稳定&#xff0c;全自动挂机无需人工操作&#xff0c;小白&#xff0c;宝妈&#xff0c;想做副业的都可以。

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

翻译技巧早操练-(减译法)

hello&#xff0c;大家好&#xff0c;今天继续来学习翻译的技巧篇第二个-减译法。 往期回顾 翻译早操练-&#xff08;增译法&#xff09;-CSDN博客 减译法的目的就是为了译入语表达的通顺&#xff0c;如果原文的一些表达直接翻译到译入语即累赘还不合时宜&#xff0c;那么可以采…

【启明智显技术分享】基于ESP32-S3方案的彩屏固件烧录指南

前言&#xff1a; 【启明智显】专注于HMI&#xff08;人机交互&#xff09;及AIoT&#xff08;人工智能物联网&#xff09;产品和解决方案的提供商&#xff0c;我们深知彩屏显示方案在现代物联网应用中的重要性。为此&#xff0c;我们一直致力于为客户提供彩屏显示方案相关的技…

主播美颜技术探秘:计算机视觉赋能的直播美颜SDK

今天&#xff0c;我们将深入探讨直播美颜技术背后的计算机视觉原理&#xff0c;以及赋能这一技术的直播美颜SDK。 一、计算机视觉与直播美颜 计算机视觉是一门研究如何使机器“看”的学科&#xff0c;它利用数字图像处理和模式识别等技术&#xff0c;使计算机能够模拟人类视觉…

STL速查

容器 (Containers) 图解容器 支持随机访问 stringarrayvectordeque支持支持支持支持 string 类 构造函数 string(); ------创建一个空的字符串 例如: string str;string(const char* s); ------使用字符串s初始化string(const string& str); ------拷贝构造 赋值操作…

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动&#xff01; 就在最近&#xff0c;有网友分享了一个用Stable Diffusion打造二次元动画的工具&#xff0c;直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元&#xff0c;耳机也可蜕变成小兔兔&#xff1a; 瞧&#xff01;连易拉罐的拉环也化身成…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

通过Oracle SQL Developer软件将指定oralce数据库中的表结构&#xff0c;表数据&#xff0c;索引以及序列号等对象导出成SQL文件。 数据库版本&#xff1a;Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 软件版本&#xff1a;Oracle SQL Develo…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

【Python】一道字典题目

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) 输出台&#xff1a;
最新文章