问题描述:
彭彭是个既漂亮又心肠好的女孩,她经营了一家礼品店,新年快来了,她想给她认识的所有小朋友们(很多很多)送些精美的小礼物,她的店中现在有K种一样大小的礼物,当然每种礼品的数量足够多,她还有一些礼品盒子,每个盒子均能盛放N个礼物。
彭彭想给每个小朋友不同的惊喜,因此她不允许任何两个盒子的礼品组合是相同的,但考虑到一些小朋友(如敏敏,佳芳等人)的特殊喜好,有些礼品必须在礼品盒中出现且要达到一定的数量,而另外一些淘气的小朋友,如明明,铁伟,总是喜欢礼品盒装的慢慢的,可是彭彭不想为这些有着特殊需求的小朋友单独准备礼品盒,因为礼品盒一旦被封装,她就无法分清楚那个盒子究竟应该送给谁。可是彭彭很聪明,经过一个晚上的努力思考,她终于想到了一个好办法,那就是让每个礼品盒都满足这些特殊的需求,这样她就可以把任意的盒子送给任意的小朋友了。彭彭在为自己聪明的脑袋感到骄傲的同时,又想知道她最多可以给多少个小朋友送礼物,这可难坏了她,那么现在就请你试试吧!
输入:
对每组输入第一行先给出K(1≤K≤50)表示礼品的种类,N(1≤N≤40)表示礼品盒的最大容量;接着第二行给K个数a[k],分别表示对于第K个物品至少应放a[k]个(0≤a[k])。
输入以“0 0”结束。
输出:
最多可送出的礼物盒数量,占一行。
input
4 20
3 1 0 5
0 0
output
364
思路:
第i个物品至少a[i]个,也就是说,除了a数组的和sum[a],还需要找n-sum[a]个物品;
则将这些物品用1 表示,
有几种物品,就用几个0 分开
则就成了n-sum[a]+k-1个字符01字符串。
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
double cal(int n,int r)
{
int ret=1;
if(r>n/2)
r=n-r;
for(int i=1;i<=r;i++,n--)
{
ret=n*ret/i;
}
return ret;
}
int main()
{
int n,m;
while(cin>>n>>m&&n&&m)
{
int a;
for(int i=0;i<n;i++)
{
cin>>a;
m-=a;
}
printf("%0.lf\n",cal(m-1+n,m));
}
}