北大oj Coins

Problem: 北大oj Coins

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

题目要求我们找出所有可能组成的金额总数,给定一系列硬币面值和每种硬币的数量。我们使用动态规划来解决这个问题。关键在于如何处理每种硬币数量大于1的情况,这需要对余数进行分组,以便于在遍历时能够有效地更新状态。

解题方法

我们首先初始化一个布尔数组dp,其长度为最大目标金额m加上1。数组中的每个元素表示是否可以组成对应位置的金额。接下来,对于每种硬币,根据其数量的不同,采取不同的策略更新dp数组。如果硬币数量为1,则直接更新dp数组;如果硬币数量多且硬币总价值大于m,则可以视为无限数量的硬币;否则,需要根据余数进行分组更新。

复杂度

时间复杂度:

O ( n × m ) O(n×m) O(n×m),其中n是硬币种类数,m是目标金额。

空间复杂度:

O ( m ) O(m) O(m),主要取决于dp数组的大小。

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;public class Main {static int MAXN = 110;static int MAXM = (int) (1e5 + 10);static int[] val = new int[MAXN];static int[] cnt = new int[MAXN];static boolean[] dp = new boolean[MAXM];static int n, m;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer in = new StreamTokenizer(br);PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));while (in.nextToken() != StreamTokenizer.TT_EOF) {n = (int) in.nval;in.nextToken();m = (int) in.nval;if (n != 0 || m != 0) {for (int i = 1; i <= n; i++) {in.nextToken();val[i] = (int) in.nval;}for (int i = 1; i <= n; i++) {in.nextToken();cnt[i] = (int) in.nval;}out.println(deal());}}out.flush();out.close();br.close();}private static int deal() {// TODO Auto-generated method stubArrays.fill(dp, 1, m + 1, false);dp[0] = true;for(int i = 1; i <= n; i++) {if(cnt[i] == 1) {for(int j = m ; j >= val[i]; j--) {if(dp[j - val[i]]) {dp[j] = true;}}} else if(val[i] * cnt[i] > m) {for(int j = val[i]; j <= m; j++) {if(dp[j - val[i]]) {dp[j] = true;}}} else {// 根据余数分组for (int mod = 0; mod < val[i]; mod++) {int trueCnt = 0;for (int j = m - mod, size = 0; j >= 0 && size <= cnt[i]; j -= val[i], size++) {trueCnt += dp[j] ? 1 : 0;}for (int j = m - mod, l = j - val[i] * (cnt[i] + 1); j >= 1; j -= val[i], l -= val[i]) {if (dp[j]) {trueCnt--;} else {if (trueCnt != 0) {dp[j] = true;}}if (l >= 0) {trueCnt += dp[l] ? 1 : 0;}}}}}int ans = 0;for(int i = 1; i <= m; i++) {if(dp[i]) {ans++;}}return ans;}}

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

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

相关文章

主键索引与唯一索引的区别

主键索引与唯一索引的区别&#xff1a; 1、主键索引是一种约束&#xff0c;唯一索引是一种索引&#xff0c;两者在本质上是不同的。 2、主键索引创建后一定包含一个唯一索引&#xff0c;唯一索引不一定包含主键索引。 3、主键索引不允许为空&#xff0c;唯一索引可以为空。 …

【ic-tool】timegen使用

一、前言 TimeGen是一个用于时序波形编辑的CAD工具&#xff0c;它允许数字设计工程师快速有效地绘制数字时序图。TimeGen时序图可以很容易地导出到其他窗口程序&#xff0c;如microsoftword&#xff0c;用于编写设计规范。可直接从官网下载TimeGEN软件&#xff1a;TimeGen Pro…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

有什么可以创建ai聊天的软件?5个软件帮助你快速创建ai聊天

有什么可以创建ai聊天的软件&#xff1f;5个软件帮助你快速创建ai聊天 AI聊天软件是一种利用人工智能技术构建的聊天机器人系统&#xff0c;它能够模拟人类的对话方式&#xff0c;回答用户提出的问题或者进行对话。这类软件在各个领域都有广泛的应用&#xff0c;可以用于客户服…

【产品经理】订单处理5-可售库存管理

可售库存即销售库存&#xff0c;本文讲解订单处理过程中的可售库存的管理。 本次讲解订单处理过程中的可售库存的管理。 可售库存即销售库存&#xff0c;电商ERP中的可售库存共分三种&#xff1a;商品的可售现货库存、商品的预售库存以及赠品的可售库存。 一、商品的可售现货…

Gobject tutorial 五

参考&#xff1a;GObject – 2.0: Type System Concepts Type System Concepts The GLib Dynamic Type System 在GLib中&#xff0c;类型的概念比通常所理解的Ojbect type更宽泛。我们将对新类型注册到类型系统时使用的函数及数据结构进行了解&#xff0c;来对此进行说明。 …

大数据之flink与hive

其实吧我不太想写flink&#xff0c;因为线上经验确实不多&#xff0c;这也是我需要补的地方&#xff0c;没有条件创造条件&#xff0c;先来一篇吧 flink&#xff1a; 高性能 低延迟 流批一体的分布式计算框架 基于事件时间 对实时数据精准处理 快速响应 支持批处理&#xff0c…

腾讯云点播ugc upload | lack signature 问题处理

我犯一个很傻的错误 参考腾讯云官方文档&#xff1a;云点播 Web 端上传 SDK-开发指南-文档中心-腾讯云 进行开发&#xff0c;但是却报错了&#xff0c;始终找不到问题&#xff0c;错误提示&#xff1a;ugc upload | lack signature&#xff0c;意思是缺少签名或者签名失败&…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏&#xff0c;回⻋ \t ---> 制表符, tab键 注意&#xff1a; print( end\n)&#xff1a; print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

HTML中的资源提示关键词

渲染阻塞问题 之前在学习浏览器的渲染原理的时候我们就知道&#xff1a;因为浏览器一次只能开启一个渲染主线程&#xff0c;所以当浏览器解析到script标签时会停止DOM树的构建&#xff0c;转而去执行script&#xff0c;如果script中引用的是外部脚本&#xff0c;则浏览器会先从…

MySQL Server和Server启动程序(一)

MySQL Server mysqld&#xff0c;也称为MySQL Server&#xff0c;是一个单线程多任务的程序&#xff0c;它在MySQL安装中执行大部分工作。它不会生成额外的进程。MySQL Server管理对包含数据库和表的MySQL数据目录的访问。数据目录也是其他信息&#xff08;如日志文件和状态文…

目标检测:NMS代码

非极大值抑制NMS是目标检测常用的后处理算法&#xff0c;用于剔除冗余检测框 总体概要&#xff1a; 对NMS进行分类&#xff0c;大致可分为以下六种&#xff0c;这里是依据它们在各自论文中的核心论点进行分类&#xff0c;这些算法可以同时属于多种类别。 分类优先&#xff1a;…

基于mysqlbinlog恢复数据

1、把binlog转换为SQL mysqlbinlog --base64-outputdecode-rows -vv /usr/local/mysql/log-bin/mysql-bin.000003 >result.sql find / -name result.sql 2、查看events show binlog events in mysql-bin.000003; 3、回滚到3667那一行的数据 mysqlbinlog -v /usr/local/mys…

Linux中手动配置Java jdk17环境

1、下载jdk二进制文件 点击官网地址&#xff1a;jdk-17_linux-x64_bin.tar.gz 或者使用wget下载 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz -P /usr/local/src/2、解压文件 tar zxvf jdk-17_linux-x64_bin.tar.gz3、修改配置 打开文件…

专业学习|博弈论-课程沿革

学习来源&#xff1a;北京大学刘霖《博弈论》MOOC公开课 备注&#xff1a;仅做学习分享&#xff0c;请勿转载&#xff0c;转载必究&#xff01; &#xff08;一&#xff09;博弈论的预备知识 基本的微积分的知识和概率论的知识。简单的说会求导数&#xff0c;会求简单的积分&am…

消息队列-Rabbit运行机制

Producer(生产者) 和 Consumer(消费者) Producer(生产者) :生产消息的一方&#xff08;邮件投递者&#xff09;Consumer(消费者) :消费消息的一方&#xff08;邮件收件人&#xff09; 消息一般由 2 部分组成&#xff1a;消息头&#xff08;或者说是标签 Label&#xff09;和 …

【已解决】chrome视频无法自动播放的问题

问题&#xff1a; 在用datav开发大屏的时候&#xff0c;放了一个视频组件&#xff0c;但是发现视频组件即使设置了自动播放&#xff0c;仍然无法自动播放 原因&#xff1a; 76 以上版本的谷歌浏览器只能在系统静音下自动播放 解决&#xff1a; 音频自动播放浏览器白名单设置&…

kafka在windows上的启动

启动zookeeper 解压kafka安装包到对应目录下&#xff0c;找到对应config目录下的zookeeper.properties文件 新建一个data文件夹&#xff0c;随便放哪 打开该文件&#xff0c;找到 dataDir/tmp/zookeeper 属性 将原来的属性值&#xff0c;修改为新建data文件夹地址&#xff0c;…

如何修改倍福CX7000PLC IP地址

我们可以通过登录网页修改PLC的IP地址,这个需要我们知道PLC的初始IP地址 1、浏览器直接输入PLC 的IP地址 2、点击修改按钮(就是那个旋转) 修改IP地址前DHCP要先disable关闭 。 3、DHCP关闭 4、点击保存 5、在CAT3里搜索 在SYSTEM双击,之后点击搜索,具体过程可以参考下…

【html】如何利用id选择器实现主题切换

今天给大家介绍一种方法来实现主题切换的效果 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…