首页新闻找找看学习计划

数据组合的问题。

0
悬赏园豆:30 [待解决问题]

最近在忙一个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实现

Tom_Tan的主页 Tom_Tan | 初学一级 | 园豆:6
提问于:2013-09-13 12:35
< >
分享
所有回答(4)
0

只能慢慢推导了

angelshelter | 园豆:9676 (大侠五级) | 2013-09-13 12:42

thank you all the same.

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:33
0

递归 配和 取余  [1,2,3..] 进行计算

--------------------

表示 - -我尝试一下 只能实现 一小部分(我没耐心了。就不继续尝试了)

Mundo Novo | 园豆:82 (初学一级) | 2013-09-13 15:13

我也试过剃归的方法,,没能成功,继续努力。

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:33

@科学怪人: 没必要递归吧。

支持(0) 反对(0) angelshelter | 园豆:9676 (大侠五级) | 2013-09-13 15:45
0

就是算个组合问题!

Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 15:31

是的,,有类拟的案例吗!?

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:33

@科学怪人: 

标准单人房(1人入住)
高级单人房(1人入住)
豪华单人房(1人入住)

这个就是一种户型 以住人分,也就是住1人的房。

高级双人房(2人入住)
豪华双人房(2人入住)

二人的房


高级三人房(3人入住)
豪华三人房(3人入住)

三人的房

也就是三种房: 1 人间  2 人间  3 人间的。

 

还有这样的组合算不算?

高级三人房(3人入住) 住3人
豪华三人房(3人入住) 住3人

这样二间房住6的组合!

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 15:36

@Albert Fei: 是的,,没错。

现在就是需要用程序来抽取这些房型的组合, 加起来,要挑3个, 刚好等于6的。

不等于6的,都不行。

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:39

@科学怪人: 必须要3间房子组合吗?

高级三人房(3人入住) 住3人
豪华三人房(3人入住) 住3人 

这样的组合行吗?

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 15:41

@Albert Fei: 不可以的,人家写明,,就要预订3间房。

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:43

@Albert Fei: 
表示3间房, 6个人入住
房间1 = 1个人入住
房间2 = 2个人入住
房间3 = 3个人入住

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:43

@科学怪人: 你们的酒店就三间房吗?是不是只针对这三种房型+6个人 特例呢?

还是要个通用的算法?

 

 

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 15:53

@Albert Fei: 这是变化多端的喔,需要通用的算法。

有可能是 rooms = 2, guests = 5 表示 2间房,5个人入住

房间1 = 2个人入住
房间2 = 3个人入住

入住人数字符串是 2,2,2,3

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 15:56

@科学怪人: 对于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为上标,这样写你应该能看懂吧)

其它类型同样可以求出来。

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 16:07

@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("");
}
}

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 16:12

@Albert Fei: 还是谢谢你。

支持(0) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 16:12

@科学怪人: 你不用c#吗? 我用c#.

你的题目也就是有N个人要住房, 有M种房型. 每种房型有Km套.

求各种组合(可能只取X套相同的型号房只要把人住进去就行)。

是这样理解的吗?

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 16:20

@科学怪人: 我只是分析一下, 不客气, 对你有帮助就好, 回答问题不是为了分.

无论多少房子, 多少人住, 每种房型有多少间. 像我那样分析应该都能解决!

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-13 16:27
0

首先请确认入住人数和房型有没有必然联系,2个房间有可能是1个人住,也有可能是5个人住,所以我认为不要纠结怎么去安排房间的问题,有些时候有些东西不是通过算法去搞定的,要存在合理的业务逻辑才去实现。

然后如果一定要实现的话,我认为是要用二维数组的,住1个人的数组下面放房型,ar[0]={roomtype1,roomtype2}。。。

剩下的就是怎么去拼房间了,按照需求是住几个人按照算法自动取组合,组合之后把里面的房型组合就行了,现在没时间写,应该不太复杂。

Johnliu | 园豆:202 (菜鸟二级) | 2013-09-13 16:14

已写好,谢谢各位大湿。

支持(1) 反对(0) Tom_Tan | 园豆:6 (初学一级) | 2013-09-13 16:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册