编程:现有1克,2克,3克,…100克砝码充分多枚,组合成100克共有多少种方式?

2024-05-24 06:08

本文主要是介绍编程:现有1克,2克,3克,…100克砝码充分多枚,组合成100克共有多少种方式?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JAVA实现拉马努金的整数拆分全排列

致敬神一般的拉马努金

点此跳转:非递归方式

由于电脑垃圾,递归算不出来结果,结果在非递归方式的文章
编程:现有1克,2克,3克,…100克砝码充分多枚,组合成100克共有多少种方式?
偶然看见有这么一个面试题,新人小白,网上搜了一下,貌似并没有相关的答案和代码,所以特意自己记录一下,并发表一下,新人小白,错了勿喷。

首先这个题,乍一看,就想到了递归,作为递归,要注意几个点,第一:找到跳出点,第二,找到规律。
那么我们开始吧,注意是充分多枚,从0开始,0克组合方式1种,1克组合方式1种,2克组合方式2种,那么继续推,3克的砝码组合方式是3种,4克的方法组合方式是5种,到了这里,肯定有小伙伴觉得这简单,这不就是斐波那契数列吗?不急,5克的砝码组合方式是7种,到了这里就发现不对劲了,斐波那契数列是112358,可是这里是112357,很明显不是了,继续:1,1,2,3,5,7,11,15,22,30.好了,这里可以明显的发现这不是斐波那契数列,是拉马努金的整数拆分全排列。
*神一般的拉马努金~~~~~*
具体公式大家可以百度,这里我贴一下公式图:
在这里插入图片描述
在这里插入图片描述
好了既然知道了规律,也有了跳出条件,0,1都只有固定一种。
那么我们接下来就用JAVA,用递归的方式来实现一遍吧。
过程着实复杂,看不懂的看注释吧。。。。。。

/*** * @author An* 拉马努金的整数拆分**/
public class Test03 {public static void main(String[] args) {int result=f1(100);System.out.println(result);}private static int f1(int i) {int result = 0;//表示最终结果int count = 1;//表示循环的次数,用来控制下标int n =1;//表示当前下标下,应该传入的数boolean flag = true;//控制加减,true=+,false= -if(i==0||i==1) {return 1;//0和1的拆分次数固定是1种,也是递归的出口}else {while(i-n>=0){//i-应该减掉的n<0跳出if(count==1) {					result +=f1(i-n);count++;//下标置为第二次n= count;//第二次应该减掉的数
//count=1的时候,表示循环刚开始,应该添加i-n(默认初始值1)}else if(count==2) {result +=f1(i-n);count++;//下标继续自增n =count*2-1;//第三次下标预设flag=!flag;//此时修改标志位,false=减少
//count=2,循环开始第二次,第一个已添加,第二是i-2,}else {if(count%2!=0) {//求模,可以知道是单数or双数,单数无需修改标志位result=(flag==true ? result+f1(i-n) : result-f1(i-n));//三目运算,根据标志位,决定是+是-count++;//标志位继续增加n +=count/2;//后面的单数规律。}else {//求模,可以知道是单数or双数,单数无需修改标志位result=(flag==true ? result+f1(i-n) : result-f1(i-n));count++;//标志位继续增加n +=count;//后面的双数规律flag = !flag;//双数后要修改标志位}}}}return result;}
}

等会继续上传非递归的方式。。。。。。第一次发帖记录一下,小白一枚,若有错误,望大神见谅。有问题希望大神指教~~~~~
非递归方式

这篇关于编程:现有1克,2克,3克,…100克砝码充分多枚,组合成100克共有多少种方式?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997587

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3