当前位置: 首页 > 编程笔记 >

C++ 整数拆分方法详解

吴凯
2023-03-14
本文向大家介绍C++ 整数拆分方法详解,包括了C++ 整数拆分方法详解的使用技巧和注意事项,需要的朋友参考一下

一、问题背景

  整数拆分,指把一个整数分解成若干个整数的和

  如 3=2+1=1+1+1 共2种拆分

  我们认为2+1与1+2为同一种拆分

二、定义

  在整数n的拆分中,最大的拆分数为m,我们记它的方案数为 f(n,m)

  即 n=x1+x2+······+xk-1+xk ,任意 x≤m

  在此我们采用递归递推法

三、递推关系

  1、n=1或m=1时 

    拆分方案仅为 n=1 或 n=1+1+1+······

     f(n,m)=1

  2、n=m时

     S1选取m时,f(n,m)=1,即n=m

     S2不选取m时,f(n,m)=f(n,m-1)=f(n,n-1),此时讨论最大拆分数为m-1时的情况

    可归纳 f(n,m)=f(n,n-1)+1

  3、n<m时

     因为不能选取m,所以可将m看作n,进行n=m时的方案,f(n,m)=f(n,n)

  4、n>m时

     S1选取m时,f(n,m)=f(n-m,m),被拆分数因选取了m则变为n-m,且n-m中可能还能选取最大为m的数

     S2不选取m时,f(n,m)=f(n,m-1),此时讨论最大拆分数为m-1时的情况

     可归纳 f(n,m)=f(n,m-1)+f(n-m,m)

总递推式为

代码如下

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int f(int n,int m)
{
if ((n!=1)&&(m!=1))
{
if (n>m) return f(n-m,m)+f(n,m-1);
else return 1+f(n,n-1);
}
else return 1;
}
void work()
{
int n,m;
cin>>n>>m;
cout<<f(n,m);
}
int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
work();
return 0;
}

以上所述是小编给大家介绍的C++ 整数拆分方法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 主要内容:1、函数声明,2、函数调用,3、没有参数和返回值的函数,4、有参数但没有返回值的函数,5、有参数且有返回值的函数,6、类中的静态函数C# 中的函数(也可以称为方法)是一段具有签名(由函数名、参数类型和参数修饰符组成的函数信息)的代码块,可以用来实现特定的功能。一般情况下一个函数由以下几个部分组成: 访问权限修饰符:用于指定函数对一个类的可见性; 返回值类型:用于指定函数返回值的数据类型; 函数名称:用于进行函数调用的唯一名称; 参数列表:在调用函数时需要传递给函数的参数,参数列表是可选

  • 我做了很多操作,将数字拆分为单独的数字,将数字放入ArrayList并将这些数字一个接一个地传递给其他ArrayList以进行进一步的操作,直到temList为空-然后是下一个比前一个大的数字。 我想知道哪种方法更快。 这两种方法的共同点是: 然后我可以通过两种方式将这些数字逐个传递给其他ArrayList mainList,并在之后删除它们:方式1: 方式2: 哪种方法更快?考虑到这是数十亿次操

  • 将一个整数,分拆为若干整数的和。例如实现: 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1 解决(Python) #! /usr/bin/env python #encoding:utf-8 """ """ def int_divided(m,r,out_list): if(r==0): return True tm=r while tm>0:

  • 本文向大家介绍C#实现合并及拆分PDF文件的方法,包括了C#实现合并及拆分PDF文件的方法的使用技巧和注意事项,需要的朋友参考一下 有时我们可能会遇到下图这样一种情况 — 我们需要的资料或教程被分成了几部分存放在多个PDF文件中,不管是阅读还是保存都不是很方便,这时我们肯定想要把这些PDF文件合并为一个PDF文件。相对应的,有时候我们也需要拆分一个大的PDF文件,来从中获取我们需要的那一部分资料。

  • 本文向大家介绍javascript 判断整数方法分享,包括了javascript 判断整数方法分享的使用技巧和注意事项,需要的朋友参考一下 判断整数的方法有两种:正则判断和逐字判断。 由于逐字判断效率过于低下,这里就不予描述了,有兴趣的看客可以自己谷歌。 1.正则判断 效果测试: http://jsfiddle.net/wzsdp9Lc/ 扩展功能列表 2.取整判断 该方法的思路是取整后判断是否等

  • 本文向大家介绍C# MathF.Floor()方法查找最大整数,包括了C# MathF.Floor()方法查找最大整数的使用技巧和注意事项,需要的朋友参考一下 C#中的MathF.Floor()方法用于查找最大整数,该整数小于或等于指定的浮点值。 语法 以下是语法- 上面的Val是浮点值。 示例 现在让我们看一个实现MathF.Floor()方法的示例- 输出结果 示例 现在让我们来看另一个实现M