问题描述:
有个表格,每一行是一张订单,关键的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;
}