整數劃分問題

2021-07-01 22:30:23 字數 749 閱讀 4671

將正整數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

int d[50],sum=0;

void huafen(int m,int n,int k)    //將m分解為不大於n的組成數,k>=0是下標

inti;

if(0==m)                      //當m為0是表示得到乙個劃分,進行輸出

sum++;                    //用來累計有多少種,並在最後輸出。

for(i=0;icoutcoutd[k]=i;

huafen(m-d[k],d[k],k+1);  //遞迴分解,直到得到乙個劃分

void main()

intn;

cout<<"請輸入要劃分的數: ";

cin>>n;

huafen(n,n,0);

cout<

整數劃分問題

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...

整數劃分問題

給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...

整數劃分問題

首先是遞迴解法 整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 65 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 共11種。下面介紹一種通過遞迴方法得到乙...