题目描述
中秋节,公司分月饼,m个员工,买了n个月饼,m<=n,每个员工至少分1个月饼,但可以分多个,单人份到最多月饼的个数为Max1,单人分到第二多月饼的个数是Max2,Max1-Max2<=3,。同理,单人分到第n-1多月饼的个数是Max(n-1),单人分到第n多月饼的个数是Max(n),Max(n-1)-Max(n)<=3。请问有多少种分月饼的方法?
#include <stdio.h>
#include <map>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
class CDivideCake
{
public:
CDivideCake(unsigned int uiMember,unsigned int uiCakeCount,unsigned int uiCakeDiffMax = 3)
:m_uiMemberNum(uiMember),m_uiCakeCount(uiCakeCount),m_uiCakeDiffMax(uiCakeDiffMax)
{
m_uiResCount = 0;
m_pMemberCakeDetail = new unsigned int[uiMember];
if (m_pMemberCakeDetail != NULL)
{
memset(m_pMemberCakeDetail,0x00,uiMember*sizeof(unsigned int));
if (uiCakeCount >= uiMember)
{
unsigned int uiCakeCountNext = uiCakeCount;
unsigned int uiMemberNext = 0;
unsigned int uiCakeMinNext = 1;
unsigned int uiCakeMaxNext = uiCakeCountNext;
DivideCakeForNext(uiMemberNext,uiCakeMinNext,uiCakeMaxNext,uiCakeCountNext);
}
}
}
unsigned int GetDivedeRes()
{
return m_uiResCount;
}
virtual ~CDivideCake()
{
if (m_pMemberCakeDetail != NULL)
{
free(m_pMemberCakeDetail);
m_pMemberCakeDetail = NULL;
}
}
protected:
int Min(int iLeft, int iRight)
{
if (iLeft < iRight)
{
return iLeft;
}
else
{
return iRight;
}
}
void DivideCakeForNext(unsigned int uiCurMemberIndex, unsigned int uiMemberCakeMin,unsigned int uiMemberCakeMax,unsigned int uiCakeCountLeft)
{
if (uiCurMemberIndex == m_uiMemberNum - 1)
{
//最后一人
if (uiCakeCountLeft - uiMemberCakeMin <= m_uiCakeDiffMax || m_uiMemberNum == 1)
{
//符合分配规则
m_pMemberCakeDetail[uiCurMemberIndex] = uiCakeCountLeft;
m_uiResCount += 1;
vector<int> vecTemp(m_pMemberCakeDetail,m_pMemberCakeDetail+uiCurMemberIndex);
m_vecDetail.push_back(vecTemp);
}
return;
}
for (unsigned int uiIndex = uiMemberCakeMin; uiIndex < uiMemberCakeMax;uiIndex++)
{
m_pMemberCakeDetail[uiCurMemberIndex] = uiIndex;
unsigned int uiCakeCountNext = uiCakeCountLeft - uiIndex;
unsigned int uiMemberNext = uiCurMemberIndex + 1;
unsigned int uiCakeMinNext = uiIndex;
unsigned int uiCakeMaxNext = Min(uiIndex + m_uiCakeDiffMax,uiCakeCountNext / (m_uiMemberNum - uiMemberNext));
DivideCakeForNext(uiMemberNext,uiCakeMinNext,uiCakeMaxNext,uiCakeCountNext);
}
}
private:
unsigned int m_uiMemberNum;
unsigned int m_uiCakeCount;
unsigned int m_uiCakeDiffMax;
unsigned int m_uiResCount;
unsigned int* m_pMemberCakeDetail;
vector<vector<int>> m_vecDetail;
};
int main()
{
CDivideCake oDiveCake(21,55,3);
unsigned int uiCakeDivideRet = oDiveCake.GetDivedeRes();
if (uiCakeDivideRet == 0)
{
cout << "参数不合法,或无满足分配方案\n";
}
else
{
cout << "满足分配方案的共有:" << uiCakeDivideRet << "种\n";
}
return 0;
}