怎样用贪心算法解这道题,目前我只想到蛮力穷举(急!)

nintendo_dskay 2008-04-15 12:13:27
某公司的服务窗前有n个顾客,设顾客i对公司的重要性为wi,对其服务的时间为ti,服务完顾客i的时间为ci
设计一种算法使得wi*ci的求和sum(i=1~n)最小

如:w1=1,t1=1;
w2=2,t2=3;

w1*t1+w2*(t1+t2)=9 < w2*t2+w1(t1+t2)=10

故sum=9;

用贪心算法如何对此求解?
...全文
151 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nealxhf 2008-04-15

按你上面的公式
w1*t1+w2*(t1+t2)< w2*t2+w1(t1+t2)
直接可以得到
左边w2*t1
右边w1*t2
就是比较这两个大小就可以了啊
不过不是很明白你的意思
时间有什么限制没有?
为什么w2要乘t1+t2?
回复
nintendo_dskay 2008-04-15
呵呵 csdn上的高手就是多 谢谢tailzhou的解答 20分送上
回复
晕!是按照wi/ti降序排序,taizhou说的是。
这两天尽犯迷糊了。
回复
tailzhou 2008-04-15
那么交换前:
wi*(t0+ti)+w(i+1)*(t0+ti+t(i+1))
交换后:
w(i+1)*(t0+t(i+1))+wi(t0+ti+t(i+1)) //漏了个括号
回复
tailzhou 2008-04-15
dlyme没看仔细,lz给的例子就是一个反例;

应该是按照wi/ti降序排序;

下面给个简要的证明:

假设不按照wi/ti降序排序的序列w0,w1,w2....wn是一个最优的调度序列;那么必定存在一个连续子序列w(i),w(i+1),有w(i+1)/t(i+1) > w(i)/t(i);

现在分析交换w(i),w(i+1)的次序后的结果
因为交换前后除 i,i+1外,其他任务的位置保持不变,所以只需要分析i,i+1的变化即可
不妨假设前i-1个任务花费的时间为t0;

那么交换前:
wi*(t0+ti)+w(i+1)*(t0+ti+t(i+1))
交换后:
w(i+1)*(t0+t(i+1)+wi(t0+ti+t(i+1))

去掉公共项:wi*t0+wi*ti+w(i+1)*t0+w(i+1)*t(i+1),不改变两式的大小关系;
就简化为:
交换前:
w(i+1)*ti
交换后:
wi*t(i+1)


同时除以ti*t(i+1),因为ti*t(i+1)>0,所以也不改变两式的大小关系
就简化为:
交换前:
w(i+1)/t(i+1)
交换后:
wi/ti;

由于wi/ti<w(i+1)/t(i+1),那么交换后的总和必定比交换前小,是一个更优的序列,与假设矛盾;


得证!
回复
题目已经提示用贪心算法了。
按Wi由高到低排序,重要性越高的大爷越先伺候。
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-15 12:13
社区公告
暂无公告