數的劃分(遞迴)

2021-08-19 11:16:30 字數 1417 閱讀 6544

整數劃分是另外的問題:

將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同(不考慮順序)。

例如:n=7,k=3,下面三種劃分方案被認為是相同的。

7=1+1+5

7=1+5+1

7=5+1+1

問有多少種不同的分法。

輸入:n,k

(1< =n <= 200,1<= k <= 6)

輸出:乙個整數,即不同的分法

7 3

四種分法為:

1+1+5;

1+2+4;

1+3+3;

2+2+3;

設 f(n,m) 為整數 n 拆分成 m 個數字的方案數.

那麼對於每乙個情況一定可以分為以下兩種情況,且不重不漏。

1.不選 1 的情況

如果不選擇 1,我們把 n 拆分成 m 塊的情況,可以等價於將每一塊都減去1,然後分為m塊,即 f(n-m,m)

2.選 1 的情況

那麼就是其中一塊肯定有乙個 1,然後對n-1分成m-1塊,即 f(n-1,m-1)。

所以總遞推式為 f(n,m)=f(n-m,m)+f(n-1,m-1)

遞迴結束的條件是

1.n=0 或 n

#include

using

namespace

std;

int dfs(int n,int k) //把n整數劃分成k份

int main()

**:

#include 

#include

using

namespace

std;

#define max 100

int parts;

//整數n分成k份,不考慮順序,譬如把3分成2份,1 2 和 2 1 是同一種情況。 統計所有情況

int dividentokpart(int n,int k,int start)//n:整數,k:分成k份 start:從start開始分類

int sum=0;

for (int i=start; i<=n/k; i++)

return sum;

}//統計情況並輸出所有情況

int dividentokpartandprintallconditions(int n,int k,int start,int condition[max],int index)

cout

1; }

int sum=0;

for (int i = start; i<=n/k; i++)

return sum;

}int main(int argc, const

char * argv)

數的劃分問題總結 DP或遞迴

問題 1531 藍橋杯 演算法提高vip 數的劃分 時間限制 1sec 記憶體限制 128mb 提交 438 解決 175 題目描述 乙個正整數可以劃分為多個正整數的和,比如n 3時 3 1 2 1 1 1 共有三種劃分方法。給出乙個正整數,問有多少種劃分方法。資料規模和約定 n 100 輸入乙個正...

A 數的劃分

a 數的劃分 將整數n 分成 k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 第一行有兩個整數 n,k 6sample input 7 3 sample output 解題思路...

集合的劃分 遞迴

題目描述 設s是乙個具有n個元素的集合,s 現將s劃分成k個滿足下列條件的子集合s1,s2,sk,滿足 1 si 2 si sj 1 i,j k i j 3 s1 s2 s3 sk s 則s1,s2,sk是集合的乙個劃分。它相當於把s集合中的n個元素a1,a2,an放入k個 0 k n 30 無標號...