讨论 / 谁能把完全背包讲清楚[再次悬赏20]
lizhixin 2010-07-23 04:15:00
点我顶贴 收藏 删除
http://www.rqnoj.cn/Discuss_Show.asp?DID=2809

第一问懂了

第二问呢..

#1 guoshi3@2008-10-17 04:42:00
回复 删除
你第三遍改之前的程序是j=1 to m,而w[i]有等于0的可能,应该改为j=0 to m。就可以了

改后为w[i] to m,自然没这个问题了

#2 guoshi3@2008-10-17 04:42:00
回复 删除
我拿小号把你第二遍的程序按我说的改了后,交了一下,ac
#3 wish@2008-10-17 04:48:00
回复 删除
这个问题上次发了那帖之后我也想了几天了

还是有很多问题

因为如果出现 w[i]=0,若 value[i] <= 0 则物品无用,但是如果 value[i] > 0 那么最后的答案就是无限,但是在这样的背包程序中仍然只会被加一次(注意 j-w[0]=j),那么我们完全可以怀疑数据有问题

看来可能需要renqing或者binarie检查一下数据正确与否

#4 Zx.MYS@2008-10-17 05:04:00
回复 删除
神奇的问题……
#5 lizhixin@2008-10-17 05:05:00
回复 删除
那我去问问去
#6 lzx@2008-10-17 05:15:00
回复 删除
1453毫秒

测试结果1: 通过本测试点|有效耗时235:ms

测试结果2: 通过本测试点|有效耗时172:ms

测试结果3: 通过本测试点|有效耗时312:ms

测试结果4: 测试结果错误.错误结果为:*16950743

正确结果应为:16950743

测试结果5: 通过本测试点|有效耗时281:ms

测试结果6: 测试结果错误.错误结果为:*95059634

正确结果应为:95068146

测试结果7: 测试结果错误.错误结果为:*11129877

正确结果应为:11144826

测试结果8: 通过本测试点|有效耗时219:ms

测试结果9: 测试结果错误.错误结果为:*6448191

正确结果应为:6450430

测试结果10: 通过本测试点|有效耗时234:ms

提交代码: var n,m,i,j:longint;

w,v,f:array[0..10001]of longint;

begin

readln(n,m);

for i:=1 to n do

begin

readln(w[i],v[i]);

if w[i]=0 then

begin

if v[i]=0 then write(’$’) else write(’*’)

end;

end;

for i:=1 to m do f[i]:=-maxlongint;

for i:=1 to n do

begin

f[0]:=0;

for j:=1 to m do

if (j>=w[i]) and (f[j-w[i]]+v[i]>f[j]) then f[j]:=f[j-w[i]]+v[i];

end;

writeln(f[m]);

end.

我用小号cheat了一下数据,的却有W[I]=0而V[I]<>0的情况,但是我第4个点为什么还能过??(除去*)

#7 lzx@2008-10-17 05:20:00
回复 删除
还有WISH你那个例子好象错了

3 7

3/2

2/100

4/2

完全有可能是3+2+2价值202.

我觉得

3 7

3/2

5/100

4/2

更能反映你的意思,你说呢?

#8 wish@2008-10-17 05:31:00
回复 删除
我写的是01背包的例子,呵呵^_^
#9 guoshi3@2008-10-17 06:45:00
回复 删除
看来对于完全背包来说,如果有w值是0的话,标程就不对了。

这个程序的数据应该也是用“标程”生成的

#10 lizhixin@2008-10-17 06:50:00
回复 删除
标程应该是我的第2个程序改成0呢

还是第3个程序

查看更多回复
提交回复