题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1222
1222:放苹果
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 2382 通过数: 1636
【题目描述】
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
【输入】
第一行是测试数据的数目t(0 ≤ t ≤ 20)。以下每行均包含二个整数M和N,以空格分开。1≤M,N≤10。
【输出】
对输入的每组数据M和N,用一行输出相应的K。
【输入样例】
1 7 3
【输出样例】
8
解析:
数学意义上讲,这道题属于整数划分。
引自百度:
指把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。这是一个典型的递归算法。
所谓整数划分,是指把一个正整数n写成为
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D151/sign=6e4ce877c0cec3fd8f3ea370e789d4b6/f636afc379310a556447cb4fb44543a98226102d.jpg)
其中,
为正整数,并且
;
为n的一个划分。如果
中的最大值不超过m,即
,则称它属于n的一个m划分。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D17/sign=ec0599b398504fc2a65fb402e4dd25e8/e7cd7b899e510fb3cc0f622cda33c895d1430c72.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D73/sign=458e9999cbfcc3ceb0c0cb309345605a/03087bf40ad162d9f04d77a712dfa9ec8b13cded.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D109/sign=71c4022f452309f7e36fa9124b0f0c39/c75c10385343fbf28c9fb198b37eca8064388fdd.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D109/sign=71c4022f452309f7e36fa9124b0f0c39/c75c10385343fbf28c9fb198b37eca8064388fdd.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D174/sign=b87f1b99b01bb0518b24b72f027bda77/58ee3d6d55fbb2fb521e4fa94c4a20a44623dc57.jpg)
解法:
这里我们记n的m划分的个数为
。例如,当n=4时,有5个划分,即
,
,
,
,
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D52/sign=2c53b098b37eca80160539e59023c3fe/9e3df8dcd100baa1535351004410b912c8fc2e09.jpg)
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D20/sign=2ec319783987e9504617f46c1138cc7f/c8177f3e6709c93de80c184c9c3df8dcd000548a.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D34/sign=9c4387477fd98d1072d40a35203fd058/ac6eddc451da81cb8b4592765166d016082431ed.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D34/sign=7928a8df97eef01f49141ec1e1fe3567/a50f4bfbfbedab64cee85c7bf436afc378311ef6.jpg)
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D50/sign=bd469c12aa014c081d3b28a50b7b8c98/a2cc7cd98d1001e96d6305b4bb0e7bec54e79729.jpg)
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D64/sign=603e75b6259759ee4e5063cfb3fb9702/a6efce1b9d16fdfac795d755b78f8c5495ee7b8b.jpg)
注意:
和
被认为是同一个划分。
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D60/sign=f20cf1e98635e5dd942ca6df77c62204/d50735fae6cd7b89239f2b380c2442a7d8330e9d.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D59/sign=8d226e70f8edab6470724dc9f63656ed/d8f9d72a6059252dfd070dbf379b033b5bb5b97c.jpg)
根据n和m的关系,考虑一下几种情况:
(一)当
时,无论m的值为多少
,只有一种划分,即
。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D35/sign=548def9c7c3e6709ba0043fa3ac76dca/29381f30e924b8995a0a6a836d061d950a7bf653.jpg)
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D49/sign=a24177edd3160924d825a312d5074c7e/4e4a20a4462309f784eebda9710e0cf3d6cad683.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D20/sign=f5f6dd928518367aa98978dd2f73bd63/902397dda144ad341c25973cd3a20cf430ad85f6.jpg)
(二)当
时,无论n的值为多少,只有一种划分,即n个1,
。
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D39/sign=1585a0bee6dde711e3d245ffa6ef212a/9f510fb30f2442a719d4ed1ed243ad4bd01302b6.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D90/sign=4acf8ffc3a12b31bc36cc1298718a1f8/342ac65c10385343c2b0949a9013b07eca808809.jpg)
(三)当
时,根据划分中是否包含n,可以分为以下两种情况:
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D41/sign=9245b704a3ec08fa220012a658ee9a83/77c6a7efce1b9d1698bc89daf0deb48f8c546415.jpg)
(1)划分中包含n的情况,只有一个,即
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D20/sign=00113d5eae6eddc422e7b3fb38db731e/3c6d55fbb2fb431663c769c123a4462308f7d3b4.jpg)
(2)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有
划分。因此
。
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D44/sign=8df56d70f8edab6470724cc4f6365635/d62a6059252dd42a01ce1210003b5bb5c8eab841.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D164/sign=6915b76475c6a7efbd26ac20c9fbafe9/960a304e251f95ca5fcc800dca177f3e6709524b.jpg)
(四)当
时,由于划分中不可能出现负数,因此就相当于
。
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D40/sign=56daee9c7c3e6709ba0044ff3ac76d96/060828381f30e92449c58e8a4f086e061d95f72c.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D48/sign=7ccc12a1c55c1038207ecfcab311c95e/7e3e6709c93d70cfae5bb8b6fbdcd100bba12be3.jpg)
(五)当
时,根据划分中是否包含最大值m,可以分为以下两种情况:
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D40/sign=e7958b242ddda3cc0fe4b92000e9d25f/d31b0ef41bd5ad6e7167765182cb39dbb7fd3cea.jpg)
(1)划分中包含m的情况,即
,其中
的和为n-m,因此这种情况下为
。
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D124/sign=26f7f9c8ae4bd11300cdb3306eaea488/267f9e2f07082838f152c1afbb99a9014c08f12a.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D94/sign=90caa53ac81349547a1ee460574e0ad1/79f0f736afc37931c4409b92e8c4b74543a91164.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D80/sign=3f1a85bf5a82b2b7a39f34c430addb94/738b4710b912c8fc5d90eb76ff039245d688212d.jpg)
(2)划分中不包含m的情况,则划分中所有值都比m小,即n的
划分,个数为
。因此
。
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D48/sign=813b07a5ba389b503cffe15a84352628/aa18972bd40735fa512753029d510fb30e2408b1.jpg)
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D76/sign=e6ee1f5a2c2eb938e86d78f4d46227cb/b7fd5266d01609241911bea0d70735fae6cd3450.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D244/sign=35fff8d3cfbf6c81f3372bec883fb1d7/7c1ed21b0ef41bd50413f44f52da81cb38db3dcc.jpg)
emmmmm....
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D128/sign=807bb2b6fbdcd100c99cfc234a8a47be/43a7d933c895d14316f7fc9870f082025baf0783.jpg)
这就是递归式。
参考代码:
1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 int n,k; 7 int dfs(int a,int p) 8 { 9 //这里很巧妙,找到了当苹果为0时作递归边界 10 if(a==0) return 1;//若没有苹果时,只有一种分法 11 if(p==1) return 1;//只有一个盘子,也是仅一种分法 12 if(a<p) return dfs(a,a);//尽可能压缩计算量,盘子数多于苹果数并无意义 13 return dfs(a,p-1)+dfs(a-p,p); 14 } 15 int main() 16 { 17 int t; 18 cin>>t; 19 for(int i=0;i<t;i++) 20 { 21 cin>>n>>k; 22 cout<<dfs(n,k)<<endl; 23 } 24 return 0; 25 }
2019-03-28 19:19:17