正整数拆分问题 将一个给定的正整数n拆分成若干个在a到b之间的正整数之和,有多少种拆法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正整数拆分问题 将一个给定的正整数n拆分成若干个在a到b之间的正整数之和,有多少种拆法相关的知识,希望对你有一定的参考价值。

n=k1+k2+k3+...+km (a<=ki<=b)
求有多少种拆法。
a和b已知
改定n
有顺序或无顺序都可以
求程序解C++或pascal都行

参考技术A #include<iostream.h>
int
main()

int a,b,c,k,i,j,t=0,sum,flag=0;
cin>>a>>b>>k;
for(i=b;i>=a;i--)
for(j=a;j<=b;j++)
if(i+j==k||i==k)
t++;
break;

if(i+j>k)break;
else
sum=i+j;
for(c=j;c>=a;c--)
if(sum+c==k)
flag=1;
t++;

if(sum+c<k)
if(flag==1)
sum=i+j;
flag=0;

sum+=c;
c++;




cout<<t<<endl;
return 0;
追问

可以输出每种拆分方法吗?

追答

//已经改了,可以输出每种拆分方法
#include
int
main()

int a,b,c,k,i,j,t=0,sum,flag;
cin>>a>>b>>k;
for(i=b;i>=a;i--)
for(j=a;jk)break;
else
sum=i+j;
flag=0;
printf("%d %d",i,j);
for(c=j;c>=a;c--)
if(sum+c==k)
flag=1;
t++;
printf(" %d\n",c);

if(sum+c<k)
if(flag==1)
sum=i+j;
printf("\n%d %d",i,j);
flag=0;

printf(" %d",c);
sum+=c;
c++;




cout<<"总的输出方法为:"<<t<<endl;
return 0;

追问

输出格式不是很理想,如果能将一次的分解结果用数组储存就更好了。
另外,能不能求出分解情况的排列数(即10=4+3+3,10=3+4+3,10=3+3+4视为不同方法)这种只需要知道总数就行了,不需要输出每种的方案。如果能做到,可以追加一些分数。

追答

不好意思 能力不够 我试了下 做不出来

本回答被提问者采纳

用java将一个正整数拆分成若干个正整数的和,问有多少种分法?

无聊了做着玩玩,用递归法,比如2=1+1,3=1+(2的所有组成法),5需要分解1+4,2+3,因为3+2和2+3是一样的,for循环只要到i<=n/2就够了.
然后就是剔除1+1+2和1+2+1的情况,继承set的特性重写了Composition(每个拆分的方式)的equals.
懒得读取n值了,直接在main里面赋值给n

public class Composition extends ArrayList<Integer>
@Override
public boolean equals(Object other)
Composition comp = (Composition)other;
Collections.sort(this);
Collections.sort(comp);
if(this.isEmpty() || comp.isEmpty() || this.size() != comp.size())
return false;
for(int i=0; i<this.size(); i++)
if(this.get(i) != comp.get(i))
return false;
return true;


@Override
public int hashCode()
return 0;



public class main

public static void main(String[] args)
int n = 6;
System.out.println(toStr(calc(n)));


public static Set<Composition> calc(int n)
Set<Composition> possibility = new HashSet<Composition>();
Composition composition = new Composition();
switch (n)
case 1:
composition.add(1);
possibility.add(composition);
return possibility;
case 2:
composition.add(1);
composition.add(1);
possibility.add(composition);
return possibility;
default:
for (int i = 1; i <= n / 2; i++)
composition = new Composition();
composition.add(i);
composition.add(n - i);
possibility.add(composition);
if (i <= n - i)
Set<Composition> partial_pos = calc(n - i);
for (Composition pos : partial_pos)
pos.add(i);
possibility.add(pos);



return possibility;




public static String toStr(Set<Composition> possibility)
String str = "total : " + possibility.size() + "\n";
for (Composition pos : possibility)
str += toStr(pos);
return str;


public static String toStr(Composition composition)
String str = composition.get(0) + "";
for (int i = 1; i < composition.size(); i++)
str += (" + " + composition.get(i));
str += "\n";
return str;

参考技术A 你能不能问的更详细一点追问

就比如说输入一个正整数4,我们可以有1+1+1+1,1+1+2,1+3,2+2,共4种方法

参考技术B 程序解决这种问题,不都是一个个试的么
不过,和貌似没啥大意思啊,通常算的是积,不是么

以上是关于正整数拆分问题 将一个给定的正整数n拆分成若干个在a到b之间的正整数之和,有多少种拆法的主要内容,如果未能解决你的问题,请参考以下文章

用java将一个正整数拆分成若干个正整数的和,问有多少种分法?

用java将一个正整数拆分成若干个正整数的和,问有多少种分法?

(求算法高手!)将一个正整数表示为N个不同的正整数之和。

LeetCode-343. 整数拆分

任意正整数拆分成2的指数幂(2的N次方)之和表示

动态规划完全背包问题《自然数的拆分》