高分求算法高手,关于一个最优匹配算法的问题

JerryLis 2010-07-25 05:09:10
我现在有些宾馆的数据:
例如:有7种房型(房型的数据量是不确定的,一般不会超过10种),分别是:
标间:108
单间:118
豪华标间:128
豪华单间:158
套间:188
豪华套间:208
总统套间:308
用户会去这个宾馆消费:我只有一个消费总额,例如消费了 1260元(标间:5个,合计:540元;豪华标间:4个,合计:512元,豪华套间:1个,合计:208元)
在我只有总消费金额的情况下,有什么样的最优算法能够算匹配出各种房型各住了多少,只要能配到一种就可以了,其它的配对不考虑。
另外还有个问题,就是我怎么安排各个房型的房间价格,可以在有总金额的情况下只有唯一的一种匹配情况,这个问题是独立的,如果麻烦可以不用考虑。
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2010-07-26
  • 打赏
  • 举报
回复
背包问题,LZ搜索一下相关资料,讲的挺详细的。
benyouyong 2010-07-26
  • 打赏
  • 举报
回复
这个问题类似于背包算法..参考一下



//定义种类
static int Num = 5;//种类

//初始数据
private List<Fruit> GetList()
{
List<Fruit> list = new List<Fruit>();
string[,] Data = this.LoadData();
for (int i = 0; i < Num; i++)
{
Fruit model = new Fruit();
model.Code = int.Parse(Data[i, 0].ToString());
model.Name = Data[i, 1].ToString();
model.Weight = int.Parse(Data[i, 2].ToString());
model.Price = float.Parse(Data[i, 3].ToString());
list.Add(model);

}
return list;

}

private string[,] LoadData()
{
string[,] Data = new string[Num, 4];
Data[0, 0] = "0";
Data[0, 1] = "A";
Data[0, 2] = "4";
Data[0, 3] = "4500";

Data[1, 0] = "1";
Data[1, 1] = "B";
Data[1, 2] = "5";
Data[1, 3] = "5700";


Data[2, 0] = "2";
Data[2, 1] = "C";
Data[2, 2] = "2";
Data[2, 3] = "2250";

Data[3, 0] = "3";
Data[3, 1] = "D";
Data[3, 2] = "1";
Data[3, 3] = "1100";


Data[4, 0] = "4";
Data[4, 1] = "E";
Data[4, 2] = "6";
Data[4, 3] = "6700";
return Data;

}

//背包算法
private int[] GetKnapsack(List<Fruit> list)
{
int max = 10; //可以容纳的最大重量
int[] value = new int[max + 1];
int[] item = new int[max + 1];
for (int i = 0; i < Num; i++)
{
for (int j = list[i].Weight; j < max + 1; j++)
{
int p = j - list[i].Weight;
int newValue = (int)list[i].Price + value[p];
if (newValue > value[j])
{
value[j] = newValue;
item[j] = i;
}
}
}
return value;
}
}
public class Fruit
{
public int Code;
public string Name;
public int Weight;
public float Price;

}
绿色夹克衫 2010-07-26
  • 打赏
  • 举报
回复
加了一个无解判断,上面的那个程序是求最接近的解。


using System;

namespace CSharpTest
{
class Program
{
public static void Main()
{
int[] items = new int[] { 108, 118, 128, 158, 188, 208, 308 };
int sum = 1268;

int[] package = new int[sum + 1];

for (int i = 1; i <= sum; i++)
package[i] = -1;

for (int i = 0; i < items.Length; i++)
{
for (int j = 0; j <= sum - items[i]; j++)
{
if (package[j] != -1 && package[j + items[i]] == -1)
package[j + items[i]] = j;
}
}

if (package[sum] != -1)
{
int current = sum;

while (current != 0)
{
int result = current - package[current];
current = package[current];
Console.Write("{0} ", result);
}
}
else
Console.WriteLine("无解");

Console.ReadKey();
}
}
}
绿色夹克衫 2010-07-26
  • 打赏
  • 举报
回复
改了一个以前写的

using System;

namespace CSharpTest
{
class Program
{
public static void Main()
{
int[] items = new int[] { 108, 118, 128, 158, 188, 208, 308 };
int sum = 1260;

int[] package = new int[sum + 1];

for (int i = 1; i <= sum; i++)
package[i] = -1;

for (int i = 0; i < items.Length; i++)
{
for (int j = 0; j <= sum - items[i]; j++)
{
if (package[j] != -1 && package[j + items[i]] == -1)
package[j + items[i]] = j;
}
}

for (int i = sum; i > 0; i--)
{
if (package[i] != -1)
{
int current = i;

while (current != 0)
{
int result = current - package[current];
current = package[current];
Console.Write("{0} ", result);
}

break;
}
}

Console.ReadKey();
}
}
}
t20100504t 2010-07-26
  • 打赏
  • 举报
回复
up PPPPPPP
段传涛 2010-07-25
  • 打赏
  • 举报
回复
在我只有总消费金额的情况下,有什么样的最优算法能够算匹配出各种房型各住了多少,只要能配到一种就可以了,其它的配对不考虑。
----------------------------
不存在打折还是比较好算的,但是以钱数算房间数,很容易算错。
Donecheng520 2010-07-25
  • 打赏
  • 举报
回复
LZ 的意思是 所有的 各要一間??

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧