最近在忙一个XML项目,关于酒店入住间数和入住人数的问题。
比如 rooms = 3, guests = 6
表示 3间房, 6个人入住
房间1 = 1个人入住
房间2 = 2个人入住
房间3 = 3个人入住
XML返回房型7个
标准单人房(1人入住)
高级单人房(1人入住)
豪华单人房(1人入住)
高级双人房(2人入住)
豪华双人房(2人入住)
高级三人房(3人入住)
豪华三人房(3人入住)
房型入住人数字符串是 1,1,1,2,2,3,3
我转成了数组arr
arr[0] = 1
arr[1] = 1
arr[2] = 1
arr[3] = 2
arr[4] = 2
arr[5] = 3
arr[6] = 3
有什么办法或语句可以提取 这12组合
arr[0] + arr[3] + arr[5] = 6
arr[0] + arr[4] + arr[5] = 6
arr[0] + arr[3] + arr[6] = 6
arr[0] + arr[4] + arr[6] = 6
arr[1] + arr[3] + arr[5] = 6
arr[1] + arr[4] + arr[5] = 6
arr[1] + arr[3] + arr[6] = 6
arr[1] + arr[4] + arr[6] = 6
arr[2] + arr[3] + arr[5] = 6
arr[2] + arr[4] + arr[5] = 6
arr[2] + arr[3] + arr[6] = 6
arr[2] + arr[4] + arr[6] = 6
这种入住情况是变法多端的
有可能是 rooms = 2, guests = 5 表示 2间房,5个人入住
房间1 = 2个人入住
房间2 = 3个人入住
入住人数字符串是 2,2,2,3
........
......
请大湿帮帮忙
用javascript实现
只能慢慢推导了
thank you all the same.
递归 配和 取余 [1,2,3..] 进行计算
--------------------
表示 - -我尝试一下 只能实现 一小部分(我没耐心了。就不继续尝试了)
我也试过剃归的方法,,没能成功,继续努力。
@科学怪人: 没必要递归吧。
就是算个组合问题!
是的,,有类拟的案例吗!?
@科学怪人:
标准单人房(1人入住)
高级单人房(1人入住)
豪华单人房(1人入住)
这个就是一种户型 以住人分,也就是住1人的房。
高级双人房(2人入住)
豪华双人房(2人入住)
二人的房
高级三人房(3人入住)
豪华三人房(3人入住)
三人的房
也就是三种房: 1 人间 2 人间 3 人间的。
还有这样的组合算不算?
高级三人房(3人入住) 住3人
豪华三人房(3人入住) 住3人
这样二间房住6的组合!
@Albert Fei: 是的,,没错。
现在就是需要用程序来抽取这些房型的组合, 加起来,要挑3个, 刚好等于6的。
不等于6的,都不行。
@科学怪人: 必须要3间房子组合吗?
高级三人房(3人入住) 住3人
豪华三人房(3人入住) 住3人
这样的组合行吗?
@Albert Fei: 不可以的,人家写明,,就要预订3间房。
@Albert Fei:
表示3间房, 6个人入住
房间1 = 1个人入住
房间2 = 2个人入住
房间3 = 3个人入住
@科学怪人: 你们的酒店就三间房吗?是不是只针对这三种房型+6个人 特例呢?
还是要个通用的算法?
@Albert Fei: 这是变化多端的喔,需要通用的算法。
有可能是 rooms = 2, guests = 5 表示 2间房,5个人入住
房间1 = 2个人入住
房间2 = 3个人入住
入住人数字符串是 2,2,2,3
@科学怪人: 对于6人入住的如下:
解法:设取1人房间个数为x, 设取2人房间个数为y,设取3人房间个数为z, 得出总住人数方程就是:
1x + 2y + 3z=6;
求出其正整数解: x=1, y=1, z=1;
1人房间x 有3间房,
2人间y有2 间房,
3人间z有2间房,
所有总共组合为: C3/1* C2/1 * C2/1 =12种组合。Cn/m (由于组合这里不太好写标准的,n为下标,m为上标,这样写你应该能看懂吧)
其它类型同样可以求出来。
@Albert Fei: 我同事给出来的答案,不过是用C#写的.
static bool[] flag = null;
static int rooms = 3;
static void Main(string[] args)
{
int guests = 6;
int[] a = new int[7] { 1, 1, 1, 2, 2, 3, 3 };
flag = new bool[a.Length];
Calculate(a, 0, guests);
Console.ReadLine();
}
/// <summary>
/// 计算
/// </summary>
/// <param name="num">数字数组</param>
/// <param name="i">索引号</param>
/// <param name="sum">结果</param>
static void Calculate(int[] num, int i, int sum)
{
int length = num.Length;
if (sum == 0)
{
Output(num, i);
}
else
{
if (i == length)
{
return;
}
else
{
flag[i] = true;
if (sum - num[i] >= 0)
{
Calculate(num, i + 1, sum - num[i]);
}
flag[i] = false;
if (sum >= 0)
{
Calculate(num, i + 1, sum);
}
}
}
}
static void Output(int[] num, int n)
{
if (flag.Count(q => q == true) == rooms)
{
for (int i = 0; i < n; i++)
{
if (flag[i])
{
Console.Write("索引:{0},数值:{1}。", i, num[i]);
}
}
Console.WriteLine("");
}
}
@Albert Fei: 还是谢谢你。
@科学怪人: 你不用c#吗? 我用c#.
你的题目也就是有N个人要住房, 有M种房型. 每种房型有Km套.
求各种组合(可能只取X套相同的型号房只要把人住进去就行)。
是这样理解的吗?
@科学怪人: 我只是分析一下, 不客气, 对你有帮助就好, 回答问题不是为了分.
无论多少房子, 多少人住, 每种房型有多少间. 像我那样分析应该都能解决!
首先请确认入住人数和房型有没有必然联系,2个房间有可能是1个人住,也有可能是5个人住,所以我认为不要纠结怎么去安排房间的问题,有些时候有些东西不是通过算法去搞定的,要存在合理的业务逻辑才去实现。
然后如果一定要实现的话,我认为是要用二维数组的,住1个人的数组下面放房型,ar[0]={roomtype1,roomtype2}。。。
剩下的就是怎么去拼房间了,按照需求是住几个人按照算法自动取组合,组合之后把里面的房型组合就行了,现在没时间写,应该不太复杂。
已写好,谢谢各位大湿。