首页 > 其他分享 >2024-03-06:用go语言,每一种货币都给定面值val[i],和拥有的数量cnt[i], 想知道目前拥有的货币,在钱数为1、2、3...m时,能找零成功的钱数有多少? 也就是说当钱数的范围是1~

2024-03-06:用go语言,每一种货币都给定面值val[i],和拥有的数量cnt[i], 想知道目前拥有的货币,在钱数为1、2、3...m时,能找零成功的钱数有多少? 也就是说当钱数的范围是1~

时间:2024-03-06 11:26:00浏览次数:29  
标签:03 cnt val 钱数 找零 ii go dp

2024-03-06:用go语言,每一种货币都给定面值val[i],和拥有的数量cnt[i],

想知道目前拥有的货币,在钱数为1、2、3...m时,能找零成功的钱数有多少?

也就是说当钱数的范围是1~m,返回这个范围上有多少可以找零成功的钱数。

比如只有3元的货币,数量是5张,

m = 10。

那么在1~10范围上,只有钱数是3、6、9时,可以成功找零,

所以返回3,表示有3种钱数可以找零成功。

答案2024-03-06:

来自左程云

灵捷3.5

大体步骤如下:

1.创建一个数组val,存储每种货币的面值,数组cnt存储拥有的每种货币的数量。

2.使用动态规划,创建一个长度为m+1的bool数组dp,dp[i]表示钱数i是否可以找零。

3.初始化dp[0]为true,因为钱数为0时不需要找零,即为成功找零。

4.遍历每种货币,根据面值和数量的不同情况分别处理找零的逻辑。

4.a.如果数量为1,遍历更新dp数组,当j >= val[i]时,如果dp[j-val[i]]为true,则说明钱数j可以成功找零。

4.b.如果数量大于1且面值*数量大于m,遍历更新dp数组,当j >= val[i]时,如果dp[j-val[i]]为true,则说明钱数j可以成功找零。

4.c.如果数量大于1且面值*数量小于等于m,使用更复杂的逻辑更新dp数组,计算出钱数j成功找零的情况。

5.遍历dp数组,计算找零成功的钱数有多少。

6.返回钱数成功找零的总数量。

总的时间复杂度为O(n*m),其中n为货币种类数,m为钱数范围。

总的额外空间复杂度为O(m),主要是dp数组的空间。

go完整代码如下:

package main

import (
	"fmt"
)

const MAXN = 101
const MAXM = 100001

var val [MAXN]int
var cnt [MAXN]int
var dp [MAXM]bool
var n, m int

func main() {

	inputs := []int{3, 10,
		1, 2, 4, 2, 1, 1,
		2, 5,
		1, 4, 2, 1,
		0, 0}

	ii := 0
	for ii < len(inputs) {
		n = inputs[ii]
		ii++
		m = inputs[ii]
		ii++

		if n != 0 || m != 0 {
			for i := 1; i <= n; i++ {
				val[i] = inputs[ii]
				ii++
			}
			for i := 1; i <= n; i++ {
				cnt[i] = inputs[ii]
				ii++
			}
			ans := compute()
			fmt.Println(ans)
		} else {
			break
		}
	}
}

func compute() int {
	for i := 1; i <= m; i++ {
		dp[i] = false
	}
	dp[0] = true

	for i := 1; i <= n; i++ {
		if cnt[i] == 1 {
			for j := m; j >= val[i]; j-- {
				if dp[j-val[i]] {
					dp[j] = true
				}
			}
		} else if val[i]*cnt[i] > m {
			for j := val[i]; j <= m; j++ {
				if dp[j-val[i]] {
					dp[j] = true
				}
			}
		} else {
			for mod := 0; mod < val[i]; mod++ {
				trueCnt := 0
				for j, size := m-mod, 0; j >= 0 && size <= cnt[i]; j -= val[i] {
					trueCnt += boolToInt(dp[j])
					size++
				}
				for j, l := m-mod, m-mod-val[i]*(cnt[i]+1); j >= 1; j -= val[i] {
					if dp[j] {
						trueCnt--
					} else {
						if trueCnt != 0 {
							dp[j] = true
						}
					}
					if l >= 0 {
						trueCnt += boolToInt(dp[l])
					}
					l -= val[i]
				}
			}
		}
	}
	ans := 0
	for i := 1; i <= m; i++ {
		if dp[i] {
			ans++
		}
	}
	return ans
}

func boolToInt(b bool) int {
	if b {
		return 1
	}
	return 0
}

在这里插入图片描述

标签:03,cnt,val,钱数,找零,ii,go,dp
From: https://www.cnblogs.com/moonfdd/p/18056117

相关文章

  • golang标准库之 fmt
    目录fmt库1.获取输入(1)fmt.Scan(常用)(2)fmt.Scanln(常用)(3)fmt.Scanf2.print、println、printf输出3.Sprint(了解即可)4.Errorf(了解即可)5.格式化占位符(1)通用占位符(2)布尔型占位符(3)整型占位符(4)浮点数与复数占位符(5)字符串和[]byte占位符(6)指针占位符(7)宽度标识符(8)其他fmt库fmt包实现了......
  • golang标准库之 flag、strconv
    目录一、flag库1.flag的简单替代2.flag的参数类型3.flag参数的定义(1)flag.Type()(2)flag.TypeVar()4.flag解析命令行参数5.flag其他方法二、strconv库1.string转换为int类型2.int转换为string类型3.Parse系列函数(1)ParseBool()(2)ParseInt()(3)ParseUnit()(4)ParseFloat()(5)示例4.Fo......
  • golang标准库之 time
    目录time库1.时间类型2.时间戳(1)时间格式转化为时间戳(2)时间戳转换为时间格式3.时间间隔类型4.时间的操作(1)时间格式化(2)解析字符串类型的时间(3)时间加时间间隔(4)两个时间之差(5)时间是否相同(6)判断时间前后(7)定时器time库time库是Go语言内置的库,用来定义和操作时间、日期time.Sl......
  • golang进阶之结构体
    目录一、结构体(Go的面向对象)1.结构体的含义2.type关键字(1)自定义新类型(2)类型的别名(3)自定义类型和类型别名的区别二、结构体的定义三、结构体实例化1.基本实例化2.匿名结构体2.指针型结构体3.取结构体的地址实例化4.结构体指针进阶实例四、结构体的初始化1.未初始化的结构......
  • 2024-03-05 NestJs学习日志之新建nest项目,运行启动命令nest start报错:Could not find
    如题,低级错误。具体报错:CouldnotfindTypeScriptconfigurationfile"tsconfig.json".Please,ensurethatyouarerunningthiscommandintheappropriatedirectory(insideNestworkspace)找不到TypeScript配置文件“tsconfig.json”。请确保您在适当的目录(Nest工作......
  • 20240305-日记(补-含0303-0304)
    我今天要是再不补,我这个目标可能就戛然而止了。这三天过得就跟三明治一样,搬家-加班-搬家。虽然想象中能搬到新家,会很开心,但是怎么说呢,还是没有一种很踏实的归属感。而且有时候我说话就是很绝,断自己和他人后路的想法。这几天也不算一点时间都挤不出来,看完了《降世神通3》,《致命游......
  • 戴尔MD3200 存储SAS SAN多路径 VS openEuler 22.03 LTS SP2
    确保系统已经安装好多路径软件;以及设定为开机自启动。编辑简版配置文件;/etc/multipath.confdefaults{user_friendly_namesyesfind_multipathsyes}blacklist{#屏蔽本地除了系统之外的硬盘wwid36b82a720cf15c5001b31a48d05dac974}multipaths{multipath{wwi......
  • Django引入极验验证码
    参考网址-https://www.cnblogs.com/lbzbky/articles/11852230.html后端部署(准备3个文件)-geetest.py#官方提供的SDK-captcha_verify.py#利用SDK生成的校验函数,发post请求的时候调用,校验验证码是否通过-captcha.py#前端页面验证码组件初始化的时候,发送get......
  • MongoDB Server 用户名和密码登录
    一、前言#默认情况下,MongoDB实例启动运行时是没有启用用户访问权限控制的,也就是说,在实例本机服务器上都可以随意连接到实例进行各种操作,MongoDB不会对连接客户端进行用户验证,这是非常危险的MongoDBServer默认不进行安全认证,即任何MongoDBClient都可以连接并拥有操作权限。在个......
  • LY1162 [ 20230323 CQYC省选模拟赛 T3 ] 跳!跳!跳!
    题意给定\(n\)个长度为\(m\)的字符串,进行若干操作,求每个字符串\(S_a\)到\(S_b\)的方案数。另外,你还有一个模式串\(T\),由\({1,...,n}\)与\(0\)(通配符)组成。从\(S_x\)右边的串开始,不断向右移动,直到\(S_y\)与\(T\)匹配。从\(S_x\)左边的串开始,不断向左......