关于酒店分房的C++实现问题

问题描述:
有个表格,每一行是一张订单,关键的2个信息是 人数和房间数,比如:
人数 7 房间数 3。 现在需要将每个人数和房间数都>1的单子进行分拆,
比如人数 7 房间数 3 分拆为 3个单子:

分别是

订单1:人数 2 房间数 1;
订单2:人数 2 房间数 1;
订单3:人数 3 房间数 1;

又比如比如人数 7 房间数 4 分拆为4个单子:
分别是

订单1:人数 2 房间数 1;
订单2:人数 2 房间数 1;
订单3:人数 2 房间数 1;
订单4:人数 1 房间数 1;

因此问题是:给定人数和房间数,算法如何设计能得到各房间的人数?ps:一般一间房间 人数在[1,3]之间。
类似的,还有另一类订单 是送餐券
可能的一种情况是 人数4,餐券数7 ---和酒店分房正好相反,应该分成4张订单。

目前我自己设计的算法是先判断
1 判断 人数>=服务数?
1.1 若是,子订单数=服务数,
2 再判断 人数%服务数==0?
2.1 若是,各子订单人数=人数/服务数
2.2 若不是, 判断 服务数x2-人数==1或-1;以此判断各子订单人数是 2+1型还是2+3型;
1.2 否则子订单数=人数
重复类似2.1 2.2的判断

但是我总觉得我设计的有点复杂,应该有更简单的解决办法吧。。。

创建对象函数,可以用数组

#include
#include

#define MIN_NUM 1
#define MAX_NUM 3

typedef struct House
{
int pNum;
int hNum;
}House;

House* house_delivery( int pNum, int hNum )
{
int tmp;
House *ding = NULL;
int i = 0;

if( hNum == 1 && pNum <= MAX_NUM )  //不拆分的情况
{
    ding = (House*)malloc( 1 * sizeof(House) );
    ding[0].hNum = 1;
    ding[0].pNum = 1;
    return ding;
}
else if( hNum * MAX_NUM < pNum )  //装不下的情况
    return NULL;

//拆分的情况
ding = (House*)malloc( hNum * sizeof(House) );
tmp = hNum;
for(i=0; i<tmp; i++)
{
    if( pNum % hNum == 0 )
    {
        ding[i].pNum = pNum / hNum;
        ding[i].hNum = 1;
    }
    else
    {
        ding[i].pNum = pNum / hNum + 1;
        ding[i].hNum = 1;
    }
    pNum -= ding[i].pNum;
    hNum -= 1;

}

return ding;

}

void show_house( House* ding, int cnt )
{
int i = 0;
for(i=0; i<cnt; i++)
{
printf("订单%d:人数%d 房间数%d\n", i+1, ding[i].pNum, ding[i].hNum );
}
}
int main( void )
{
int pNum = 7;
int hNum = 8;
House *ding = house_delivery( pNum, hNum );

show_house(ding, hNum );

system("pause");
return 0;

}