讨论 / 为什么错?
marslove 2008-04-20 19:59:00
点我顶贴 收藏 删除
这样搜索有错吗?难道非要背包做?

var i,j,n,m,s,d:longint;

a,b,c:array [1..10000] of longint;

begin

s:=0;

d:=0;

readln (n,m);

for i:=1 to m do

begin

read (a[i]);

readln (b[i]);

end;

for i:=1 to m do

c[i]:=a[i]*b[i];

while n>=0 do

begin

j:=0;

for i:=1 to m do

if (c[i]>j) and (a[i]<=n) then begin j:=c[i];d:=i; end;

c[d]:=0;

n:=n-a[d];

s:=s+j;

end;

write(s);

end.

#1 fjxmlhx@2008-03-29 21:01:00
回复 删除
不用递归的深搜..很好..
#2 烽火连城@2008-04-20 19:59:00
回复 删除
--------

for i:=1 to m do

if (c[i]>j) and (a[i]<=n) then begin j:=c[i];d:=i; end;

c[d]:=0;

n:=n-a[d];

s:=s+j;

end;

----------这个程序段是从第一个到第M个来比较,如果比N小就买,但是你看测试数据,第一个800块,重要度2,这个按你的程序是符合条件的,但实际上不是.

我的考虑是把 钱数/重要度 得出一个每重要度的钱数,先考虑最小的,比如 800 2 和 500 3 就应该先选择买500的东西,

查看更多回复
提交回复