整数划分问题(算法分析与设计P12):将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数和方案。例如正整数6有如下11种不同的划分:
-
6
-
5+1
-
4+2,4+1+1
-
3+3,3+2+1,3+1+1+1
-
2+2+2,2+2+1+1,2+1+1+1+1
-
1+1+1+1+1+1
由于将思路写作注释更方便理解,就不再在前面赘述了,给出代码及思路如下:
-
#include
-
-
intlist[255];
-
-
// num: 要分割的原始数字, n: 当前要分割的数字, k: 已经分割出的数量, sum: 已分割出的数字之和
-
voidsplit(intnum,intn=0,intk=0,intsum=0){
-
// 如果当前要分割的数字未传入,则当前分割的数字即为要分割的原始数字,减少传入参数数量
-
if(n==0){
-
n=num;
-
}
-
// 如果已分割的数字之和等于要分割的原始数字,即分割完毕
-
if(sum+n==num){
-
// 将最后一个数字存入数组
-
list[k]=n;
-
// 判断已分割的数字是否后面小于前面,防止重复
-
boolflag=true;
-
// 暂时未想到更好办法去除重复项,每次都要遍历数组,性能较低
-
for(inti=1;i<=k;++i){
-
if(list[i]>list[i-1]){
-
flag=false;
-
}
-
}
-
// 如果数组合法,则输出
-
if(flag){
-
printf("%d",list[0]);
-
for(inti=1;i<=k;++i){
-
printf("+%d",list[i]);
-
}
-
printf("\n");
-
}
-
}
-
// 从小到大进行分割
-
for(inti=1;i<n;++i){
-
// 分割剩下的数字存入数组
-
list[k]=n-i;
-
// 分割出的数字继续分割
-
split(num,i,k+1,sum+n-i);
-
}
-
}
-
-
intmain(){
-
intn;
-
while(~scanf("%d",&n)){
-
split(n);
-
}
-
return0;
- }
=======================签 名 档=======================
原文地址(我的博客):http://www.clanfei.com/2012/12/1672.html
欢迎访问交流,至于我为什么要多弄一个博客,因为我热爱前端,热爱网页,我更希望有一个更加自由、真正属于我自己的小站,或许并不是那么有名气,但至少能够让我为了它而加倍努力。。
=======================签 名 档=======================
分享到:
相关推荐
整数划分问题是一个经典的计算机科学问题,主要涉及组合优化和图论领域。在数学上,它指的是给定一个正整数n,寻找所有可能的方法将其分成若干个正整数的和,每个正整数称为一个部分。每个不同的部分组合构成一个...
算法:整数划分问题,将一个整数n表示成一系列正整数之和。
整数划分方法1是一种在计算机科学和算法设计中常见的问题,它涉及到将一个给定的非负整数拆分为若干个正整数之和,这些正整数的和必须等于原始整数。这个问题通常用于解决各种数学问题,例如在游戏理论中的循环游戏...
整数划分是组合优化领域的一个经典问题,源于数学和计算机科学。在整数划分问题中,我们需要找到一个非负整数序列(可以为空),使得这些整数之和等于给定的正整数S,且序列中的每个元素都不相同。这个问题在算法...
java算法分析与设计之整数划分问题源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的可怜,...
整数划分问题是一个经典的组合数学问题,主要研究如何将一个正整数分解为若干个正整数之和的不同方式。这个问题不仅在数学领域有广泛的应用,在计算机科学、算法设计等方面也具有重要意义。 #### 二、题目描述及...
整数的分划问题 将正整数n表示成一系列正整数之和,n=n1+n2+...+nk,其中n1>n2>...>nk,k>=1。正整数n的不同划分个数称为n的划分数
### 整数划分算法解析与实现 #### 一、整数划分的概念 整数划分是组合数学中的一个重要概念,指的是将一个正整数表示为若干个正整数之和的不同方式的数量。例如,数字4可以被划分为1+1+1+1、1+1+2、1+3或4本身等几...
整数划分问题作为计算机科学中一项经典的算法问题,对于计算机科学和数学领域均有着重要的应用价值。该问题的核心是将给定的非负整数n拆分为若干个正整数之和,这些正整数被称为划分的“部分”。例如,整数4可以划分...
算法中的整数划分代码,代码实现,教材中的代码实现
综上所述,整数划分实验不仅锻炼了学生对递归算法的理解,还涉及了问题分析、算法设计、程序实现以及结果验证等多个环节。对于编程初学者而言,这是一个很好的实践机会,能够加深对算法课程理论知识的理解,并提升...
最近我写了一篇csdn文章:【算法设计与分析】——整数划分问题(回溯法),并且画了一个流程图,为了让大家更加清楚的理解我讲的内容,所以我给大家录了一个讲解视频,希望大家一起进步哦~
整数划分是一个经典的数学问题,它涉及到将一个正整数N划分为若干个正整数的和,且每个部分可以是1到N之间的任意整数,但不允许重复。在计算机科学中,这个问题常用于算法设计和分析,尤其是在动态规划、递归以及...
整数划分问题是一个经典的组合数学问题,其目标是将一个正整数拆分成若干个正整数之和的不同方式的数量。例如,整数4可以被划分为5种不同的方式:4、3+1、2+2、2+1+1、1+1+1+1。在本篇分析中,我们将详细介绍如何...
根据给定的信息,我们可以推断出这是一个与整数划分(Integer Partition)相关的算法问题。整数划分是指将一个正整数表示为多个正整数之和的方法,且这些加数的顺序不重要。例如,数字4可以被划分为4、3+1、2+2、2+1...
为了解决这个问题,我们可以使用递归方法来实现整数划分算法。递归函数的声明为 `int split(int n, int m);其中 n 为要划分的正整数,m 是划分中的最大加数(当 m > n 时,最大加数为 n)。在递归函数中,我们需要...
整数划分是计算机科学中的一种经典算法问题,主要研究如何将一个正整数拆分成一组非负整数的和,且这些整数的和恰好等于原数。在本例中,我们关注的是最大加数不超过原数的整数划分。这个问题涉及到递归思想和数学...
整数划分问题是一种经典的组合数学问题,主要研究如何将一个正整数表示为若干个正整数之和的方式。在本问题中,我们需要找到一个正整数\( n \)的所有可能的划分方式,并计算出这些划分的数量。具体来说,对于一个正...