LOJ 10018 數的劃分

2021-09-11 11:52:46 字數 1206 閱讀 7683

題目鏈結

題目描述

將整數 n 分成 k 份,且每份不能為空,問有多少種不同的分法。當 n=7, k=3 時,下面三種分法被認為是相同的:1,1,5; 1,5,1; 5,1,1

輸入格式

一行兩個數 n , k。

輸出格式

一行乙個整數,即不同的分法數。

樣例樣例輸入

7 3樣例輸出

樣例解釋

四種分法為:1,1,5;1,2,4;1,3,3;2,2,3。

資料範圍與提示

6≤n≤200, 2≤k≤6。

將整數n分成k份就相當於將n個蘋果放入k個籃子裡且每個籃子裡都至少放入乙個蘋果,即將(n-k)個蘋果放入k個籃子且允許有的籃子為空。

接下來考慮將m個蘋果放入k個籃子裡(允許有的籃子為空),設f(m,k)為m個蘋果放入k個籃子裡(允許有的籃子為空)的方法數目;

當k>m時,(k-m)個籃子必定是空的,這些多餘的籃子可忽略:if(k>m) f(m,k)=f(m,m);

當k<=m時,又可分為兩種情況,①有乙個籃子為空時,這個多餘的籃子可忽略:f(m,k)=f(m,k-1),多於乙個籃子為空的情況由f(m,k-1)計算;②全部籃子不為空時,相當於可以至少從每個籃子裡拿出乙個蘋果:f(m,k)=f(m-k,k);

即:if(k<=m) f(m,k)=f(m,k-1)+f(m-k,k);

邊界條件:當m==0時,無方法,定義f=1;當n==1時,所有蘋果放在乙個籃子裡,f=1;

遞迴:

//csdn部落格:

#include#include#include#include#include#include#include#include#include#include#include#include#include#define mem(a,b) memset(a,b,sizeof(a))

#define random(a,b) (rand()%(b-a+1)+a)

#define e 2.71828182

#define pi 3.141592654

using namespace std;

int f(int m,int k)

int main()

} cout用時:

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 解題思路...

wikioi 數的劃分

題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入描述 input description 輸入 n,k 6 題解 f i,j ...

1039 數的劃分

題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入描述 input description 輸入 n,k 6輸出描述 outpu...