紧急求助一个关于组合方式中择优算法问题!可再增加分数(300分)

  • 主题发起人 主题发起人 TUTUYA
  • 开始时间 开始时间
T

TUTUYA

Unregistered / Unconfirmed
GUEST, unregistred user!
前天有一个朋友委托我编一个程序实现求最优解的问题,我苦想了一整天,实在没有办法,只好
求助各位高手了。假设有一个售票系统,有A B C D四种等级依次升高的票可出售,可提前10天
售票,每一天只能出售一种票,且随着时间的推移(提前天数减少)票的等级不能减低,即假设
第10天出售A等级票,第9天出售B等级票,那么的8天只能出售B,C,D中的一种票,而不能出售A票,
其后依次类推。四种票中任何一种在每一天的价格均不相同(存在折扣率的问题),并且四种票
在每一天的预计售票量也不同。求这些售票组合中的收益最大(票额×预计售票量之和最大)的
一种售票组合方式。
售票组合方式如下:
提前天次 10 9 8 7 6 5 4 3 2 1 0
售票组合方式 A A A A A A A A A A A
AB组合 A A A A A A A A A A B
A A A A A A A A A B B
.........................................
AC组合 A A A A A A A A A A C
A A A A A A A A A C C
.........................................
AD组合 A A A A A A A A A A D
.........................................
ABC组合 A A A A A A A A A B C
.........................................
ABCD组合 A A A A A A A A B C D
.........................................
BC组合 B B B B B B B B B B C
.........................................
BD组合 B B B B B B B B B B D
.........................................
BCD组合 B B B B B B B B B C D
B B B B B B B B C C D
.........................................

CD组合 C C C C C C C C C C D
.........................................

问题非常急,万望各位老师指点,给出算法,感激备至!
 
感觉象动态规划的题目.
 
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
Num: array [0..10, 1..4] of Integer;
Price: array [0..10, 1..4] ofdo
uble;
MaxTotal: array [0..10, 1..4] ofdo
uble;
Next: array [0..10, 1..4] of Integer;
Max:do
uble;
MaxPos: Integer;
i, j, k: Integer;
procedure Init;
var
i, j: Integer;
begin
for i:=10do
wnto 0do
for j:=0 to 3do
begin
Write('输入提前', i, '天出售票'+Chr(Ord('A')+j), '的数量: ');
ReadLn(Num[i, j+1]);
Write('输入提前', i, '天出售票'+Chr(Ord('A')+j), '的价格: ');
ReadLn(Price[i, j+1])
end
end;

begin
Init;
for i:=1 to 4do
MaxTotal[0, i]:=Num[0, i]*Price[0, i];
for i:=1 to 10do
for j:=1 to 4do
begin
Max:=-1;
for k:=1 to jdo
if MaxTotal[i-1, k]>Max then
begin
Max:=MaxTotal[i-1, k];
MaxPos:=k
end;
MaxTotal[i, j]:=Max+Num[i, j]*Price[i, j];
Next[i, j]:=MaxPos
end;
Max:=-1;
for i:=1 to 4do
if MaxTotal[10, i]>Max then
begin
Max:=MaxTotal[10, i];
MaxPos:=i
end;
Write('10:',Chr(Ord('A')+MaxPos-1));
for i:=9do
wnto 0do
begin
MaxPos:=Next[i+1, MaxPos];
Write(' ', i, ':', Chr(Ord('A')+MaxPos-1))
end;
ReadLn
end.
 
to LeeChange:
谢谢您的解答,但是好像你没有注意到我的一个条件:随着时间的推移(提前天数减少)票的等级不能减低,即假设第10天出售A等级票,第9天出售B等级票,那么的8天只能出售B,C,D中的一种票,而不能出售A票了(以后也不能),,其后依次类推。也就是说,像下列这种组合式是排除在外的情况:10:A 9:B 8:B 7:C 6:C 5:C 4:C 3:B 2:C 1:A 。
谢谢您,您能再考虑一下吗?
 
呵呵,不是没考虑,而是考虑反了,我卖的票的等级成了递减.

for k:=1 to jdo
改为
for k:=j to 4do
就可以了.
 
to LeeChange:
非常感谢!问题解决了!
 
后退
顶部