題目鏈結
題目描述
將整數 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...