代码随想录第三十七天

52.携带研究材料

题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的重量,并且具有不同的价值。

小明的行李箱所能承担的总重量是有限的,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。

输入描述

第一行包含两个整数,n,v,分别表示研究材料的种类和行李所能承担的总重量

接下来包含 n 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值

输出描述

输出一个整数,表示最大价值。

输入示例

4 5
1 2
2 4
3 4
4 5

输出示例

10

提示信息

第一种材料选择五次,可以达到最大值。

数据范围:

1 <= n <= 10000;
1 <= v <= 10000;
1 <= wi, vi <= 10^9.

思路:

题目很明显说明了,他是无限次数的,所以我们可以重复,那么我们应该从小到大进行遍历,其实这就是一个完全背包问题,除了第二个循环中变成了从小到大进行遍历我觉得其他地方没有什么变化。

解答:

#include <stdio.h>
int main()
{int n,v;scanf("%d %d",&n,&v);int weight[n];int value[n];int* dp = calloc(v+1,sizeof(int));for(int i = 0;i < n;i++){int wi,vi;scanf("%d %d",&wi,&vi);weight[i] = wi;value[i] = vi;}for(int i = 0;i < n;i++){for(int j = weight[i];j <= v;j++){dp[j] = fmax(dp[j],dp[j-weight[i]]+value[i]);}}printf("%d",dp[v]);return 0;
}

518.零钱兑换||

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0

假设每一种面额的硬币有无限个。

题目数据保证结果符合 32 位带符号整数。

示例 1:

输入:amount = 5, coins = [1, 2, 5]
输出:4
解释:有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

示例 3:

输入:amount = 10, coins = [10] 
输出:1

提示:

  • 1 <= coins.length <= 300
  • 1 <= coins[i] <= 5000
  • coins 中的所有值 互不相同
  • 0 <= amount <= 5000

思路:

因为次数不限,所以这是一道完全背包问题,这里的dp[i]为前i个数的组合次数为多少,因为可以重复取值,对于每一个硬币,我们从最小的背包容量开始计算,确保每个硬币都能被重复使用。然后算出dp[amount]就可以得到答案了。但是要注意int可能存储不了太大的数,所以我换成了unsigned long long,这样才能运行通过。

解答:

int change(int amount, int* coins, int coinsSize) {unsigned long long* dp = calloc(amount+1,sizeof(unsigned long long));dp[0] = 1;for(int i = 0;i < coinsSize;i++){for(int j = coins[i];j <= amount;j++){dp[j] += dp[j-coins[i]];}}return dp[amount];
}

377.组合总和IV

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <= target <= 1000

思路:

使用 dp[j] 表示凑成金额 j 的组合数,初始化 dp[0] = 1,表示凑成金额 0 的方法只有一种(不选数字)。然后,外层循环遍历所有可能的金额 j,内层循环遍历 nums 中的每个数字,判断是否能通过当前数字凑成金额 j,若能,则更新 dp[j]为 dp[j] += dp[j - nums[i]],表示通过选择 nums[i]后,增加了凑成 j 的组合数。最终,dp[target]就是所有组合方式的数量。

解答:

int combinationSum4(int* nums, int numsSize, int target) {unsigned long long* dp = calloc(target+1,sizeof(unsigned long long));dp[0] = 1;for(int j = 0;j <= target;j++){for(int i = 0;i < numsSize;i++){if(j - nums[i] >= 0)dp[j] += dp[j-nums[i]];}}return dp[target];
}

57.爬楼梯(第八期模拟笔试)

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

输入描述

输入共一行,包含两个正整数,分别表示n, m

输出描述

输出一个整数,表示爬到楼顶的方法数。

输入示例

3 2

输出示例

3

提示信息

数据范围:
1 <= m < n <= 32;

当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。

此时你有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶段
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

思路:

这道题是一个完全背包,并且它是关于排列数的一个问题,所以我们需要让背包容量在第一层循环,遍历楼梯步数在第二层,设置dp[i]为前i层楼梯有几种方式到达楼梯,然后利用动态规划得到求解。

解答:

#include <stdio.h>
#include <stdlib.h>
int main()
{int n,m;scanf("%d %d",&n,&m);int* dp = calloc(n+1,sizeof(int));dp[0] = 1;for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++)   {if(i-j >= 0)dp[i] += dp[i-j];}}printf("%d",dp[n]);return 0;
}

反思

根据今天的题目,我觉得对于动态规划有了一定的了解,以及我觉得对于动态规划的一些题目有了一定的认识。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[开源] 告别黑苹果!用docker安装MacOS体验苹果系统

没用过苹果电脑的朋友可能会对苹果系统好奇&#xff0c;有人甚至会为了尝鲜MacOS去折腾黑苹果。如果你只是想体验一下MacOS&#xff0c;这里有个更简单更优雅的解决方案&#xff0c;用docker安装MacOS来体验苹果系统。 一、项目简介 项目描述 Docker 容器内的 OSX&#xff08…

redis延时队列

引入 <redisson.version>3.15.5</redisson.version><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>${redisson.version}</version></dependency>…

「四」体验HarmonyOS端云一体化开发模板——工程目录结构与云侧工程一键部署AGC云端

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

241121学习日志——[CSDIY] [InternStudio] 大模型训练营 [11]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

STM32完全学习——使用SysTick精确延时(阻塞式)

一、SysTick相关寄存器 首先关于SysTick寄存器的数据在下面这个文件里面可以找到&#xff0c;平时那个数据手册是没有的。其次我这边使用的开发板是F407的开发板&#xff0c;关于这个寄存器的数据都是来自下面这个文件的截图&#xff0c;一般只会用到这3个寄存器。 二、使用标…

理解加密:常见算法及其应用

在信息安全领域&#xff0c;加密技术被广泛用于保护数据的机密性。加密的核心目的是将明文信息转化为密文&#xff0c;以防止未经授权的访问和数据泄露。本文将介绍几种常见的加密算法&#xff0c;包括对称加密、非对称加密和哈希算法&#xff0c;并提供 C# 代码示例&#xff0…

【机器学习】- 模型复杂度vs模型误差

目录 0.引言1.模型复杂度vs模型误差1.1. 模型误差的分类1.2 模型复杂度与误差的关系1.3 偏差-方差权衡&#xff08;Bias-Variance Tradeoff&#xff09;1.4 可视化&#xff1a;误差与复杂度1.5 如何选择模型复杂度&#xff1f;1.6 总结 2.方差描述含义&#xff1a;2.1 方差的定…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…

什么是SEO中的博客评论?

博客评论通过为其他网站提供价值来帮助你建立反向链接。 例如&#xff0c;你在你的网站上发布烘焙技巧。你可以在一个很受欢迎的食谱博客上评论巧克力饼干的帖子&#xff1a; “多么美味的食谱啊&#xff01;”为了防止饼干在烤箱里散开&#xff0c;试着在烘烤前将面团冷却至…

插件元器件焊接错了该怎么处理指南!!!

前言&#xff1a;编写不易&#xff0c;请勿搬运&#xff0c;仅供学习&#xff01;&#xff01;&#xff01; 目录 插件引脚焊接标准 ​编辑 板子不平如何焊接插件 电烙铁快速焊接插件 焊接把过孔封住怎么办 焊接插件元器件焊错了怎么处理 电烙铁焊接贴片 插件引脚焊接标准…

高级java每日一道面试题-2024年11月18日-基本篇-Java创建对象有几种方法?

如果有遗漏,评论区告诉我进行补充 面试官: Java创建对象有几种方法? 我回答: 在 Java 中&#xff0c;创建对象有多种方法。以下是常见的几种方法及其详细解释&#xff1a; 1. 使用 new 关键字 这是最常见的创建对象的方法。通过调用类的构造方法来创建对象。 MyClass ob…

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素&#xff1a;机密性、完整性、可用性、可控性、审查性 信息安全范围&#xff1a;设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在&#xff1a;物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境&#xff0c;它在现代 JavaScript 开发中扮演着重要角色。然而&#xff0c;许多开发者在使用 Node.js 时常常会感到困惑&#xff0c;尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异&#xff0c;帮助你全面理解两者的设计…

用Python爬虫“偷窥”1688搜索词推荐:一场数据的奇妙冒险

在这个信息爆炸的时代&#xff0c;数据就像是藏在深海里的宝藏&#xff0c;等待着勇敢的探险家去发掘。今天&#xff0c;我们将化身为数据海盗&#xff0c;用Python作为我们的船只&#xff0c;航向1688的海域&#xff0c;去“偷窥”那些神秘的搜索词推荐。准备好了吗&#xff1…

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存&#xff1f; 缓存就是与数据交互中的缓冲区&#xff0c;它一般存储在内存中且读写效率高&#xff0c;提高响应时间提高并发性能&#xff0c;如果访问数据的话可以先访问缓存&#xff0c;避免数据查询直接操作数据库&#xff0c;造成后端压力过大。 但是可能会面…

全面解析:HTML页面的加载全过程(一)--输入URL地址,与服务器建立连接

用户输入URL地址&#xff0c;与服务器建立连接 用户在浏览器地址栏输入一个URL 浏览器开始执行以下三步操作操作&#xff1a;url解析、DNS查询、TCP连接 第一步&#xff1a;URL解析 什么是URL&#xff1f; URL(Uniform Resource Locator&#xff0c;统一资源定位符)是互联网…

uni-ui自动化导入

2024年8月6日 https://uniapp.dcloud.net.cn/component/uniui/uni-ui.html 安装 https://www.npmjs.com/package/dcloudio/uni-ui npm i dcloudio/uni-ui配置自动导入功能 在pages.json文件里添加easycom节点: "easycom": {"autoscan": true,"custom…

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1&#xff1a;完成网络部署 2、任务 2&#xff1a;设计全网 IP 地址 3、任务 3&#xff1a;实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …

电脑超频是什么意思?超频的好处和坏处

嗨&#xff0c;亲爱的小伙伴&#xff01;你是否曾经听说过电脑超频&#xff1f;在电脑爱好者的圈子里&#xff0c;这个词似乎非常熟悉&#xff0c;但对很多普通用户来说&#xff0c;它可能还是一个神秘而陌生的存在。 今天&#xff0c;我将带你揭开超频的神秘面纱&#xff0c;…

android 如何获取当前 Activity 的类名和包名

其一&#xff1a;getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…