讨论 / 怎么会这样?
lihao 2008-09-08 05:34:00
点我顶贴 收藏 删除
测试结果错误.错误结果为:137034

13 14 15 17 24 28 34 49 52 56 59 65 77 85 88 97 98 101 102 110 121 126 127 130 140 141 145 150 158 162 173 174 181 182 184 187 202 204 205 208 219 221 226 238 244 245 246 251 253 256 278 285

正确结果应为:137034

13 14 15 17 24 28 34 49 52 56 59 65 77 85 88 97 98 101 102 110 121 126 130 140 141 145 150 158 162 173 174 181 182 184 187 202 204 205 208 219 221 226 244 245 251 253 256 285

测试结果错误.错误结果为:137034

13 14 15 17 24 28 34 49 52 56 59 65 77 85 88 97 98 101 102 110 121 126 127 130 140 141 145 150 158 162 173 174 181 182 184 187 202 204 205 208 219 221 226 238 244 245 246 251 253 256 278 285

正确结果应为:137034

13 14 15 17 24 28 34 49 52 56 59 65 77 85 88 97 98 101 102 110 121 126 130 140 141 145 150 158 162 173 174 181 182 184 187 202 204 205 208 219 221 226 244 245 251 253 256 285

测试结果错误.错误结果为:89407

1 2 3 4 5 6 7 8 10 11 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 33 34 36 38 39 39

正确结果应为:80314

1 2 3 4 5 6 7 10 11 14 16 17 18 20 21 23 27 29 30 32 34 36 37 38

测试结果错误.错误结果为:100892

5 9 19 28 33 34 35 37 45 47 57 72 74 81 86 90 91 100 102 119 120 122 125 127 128 130 137 138 140 144 145 147 148 154 161 162 173 181 186 188 191 203 204 211

正确结果应为:100892

5 9 19 28 33 34 35 37 45 47 57 72 91 100 102 119 120 122 128 130 137 138 140 144 145 147 148 154 161 162 173 181 186 188 191 203 204 211

以上是我4个错结果,下面是我的程序:(大牛帮忙看看哪出了问题)。

program p109;

type

rec=record t,a,b:integer;end;

var

f:array[0..500,0..5000]of longint;

father:array[0..500,0..5000]of rec;

v,w,c:array[1..500]of integer;

n,m,i,j,x,y,z,g:integer;

function max(a,b:longint):longint;

begin

if a>b then max:=a

else max:=b;

end;

begin

readln(n,m);

for i:=1 to n do begin readln(x,y,z);v[i]:=x*z;w[i]:=y*z;end;

f[0,0]:=0;

for i:=1 to n do

for j:=1 to m do

if(j>=v[i])then

begin

f[i,j]:=max(f[i-1,j],f[i-1,j-v[i]]+w[i]);

if f[i,j]=f[i-1,j-v[i]]+w[i] then

begin

father[i,j].a:=i-1;

father[i,j].b:=j-v[i];

father[i,j].t:=i;

end

else begin

father[i,j].a:=i-1;

father[i,j].b:=j;

father[i,j].t:=0;

end

end

else begin

f[i,j]:=f[i-1,j];

father[i,j].a:=i-1;

father[i,j].b:=j;

father[i,j].t:=0;

end;

writeln(f[n,m]);

i:=n;j:=m;g:=0;

while(i<>0)or(j<>0)do

begin

if(father[i,j].t<>0)then begin inc(g);c[g]:=father[i,j].t;end;

x:=father[i,j].a;y:=father[i,j].b;

i:=x;j:=y;

end;

for i:=g downto 1 do if i<>1 then write(c[i], ) else write(c[i]);

end.

会不会是有多种情况咯~~

#1 jsn1993@2007-11-12 05:22:00
回复 删除
我编的 过了70

program qinggonghui;

var

f:array[0..500,-5000..5000]of longint;

i,j,m,n,tt,t:longint;

jl,v,w,s:array[1..500]of integer;

procedure out(i,j:integer);

begin

if i=0 then exit;

if f[i,j]=f[i-1,j-v[i]*s[i]]+w[i]*s[i] then begin

inc(t);jl[t]:=i;

out(i-1,j-v[i]*s[i]);

end

else out(i-1,j);

end;

begin

readln(n,m);

for i:=1 to n do readln(v[i],w[i],s[i]);

fillchar(f,sizeof(f),0);

for i:=1 to n do

for j:=0 to m do begin

f[i,j]:=f[i-1,j];

if (j>=v[i]*s[i])and(f[i,j]<f[i-1,j-v[i]*s[i]]+w[i]*s[i]) then f[i,j]:=f[i-1,j-v[i]*s[i]]+w[i]

*s[i];

end;

writeln(f[n,m]);t:=0;

out(n,m);

for i:=1 to t-1 do

for j:=i+1 to t do

if jl[i]>jl[j] then begin

tt:=jl[i];jl[i]:=jl[j];jl[j]:=tt;

end;

for i:=1 to t do write(jl[i], )

end.

测试结果1: 测试结果正确

测试结果2: 测试结果错误.错误结果为:

70701

5 18 40 42 45 48 60 {79 83 84 90 }92 {103} 105 109 {112} 120 133 154 171 175 191 196 214 218 225 227

238 241 {247 251} 259 273 {280} 293 304

正确结果应为:

70701

5 18 42 45 48 60 90 92 105 109 120 133 154 171 175 191 196 214 218 225 227 238 241 259 273 293 304

测试结果3: 测试结果正确

测试结果4: 测试结果正确

测试结果5: 测试结果正确

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

137034

13 14 15 17 24 28 34 49 52 56 59 65 77 85 88 97 98 101 102 110 121 126 127 130 140 141 145 150 158 162

173 174 181 182 184 187 202 204 205 208 219 221 226 238 244 245 246 251 253 256 278 285

正确结果应为:

137034

13 14 15 17 24 28 34 49 52 56 59 65 77 85 88 97 98 101 102 110 121 126 130 140 141 145 150 158 162 173

174 181 182 184 187 202 204 205 208 219 221 226 244 245 251 253 256 285

测试结果7: 测试结果正确

测试结果8: 测试结果正确

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

100892

5 9 19 28 33 34 35 37 45 47 57 72 74 81 86 90 91 100 102 119 120 122 125 127 128 130 137 138 140 144

145 147 148 154 161 162 173 181 186 188 191 203 204 211

正确结果应为:

100892

5 9 19 28 33 34 35 37 45 47 57 72 91 100 102 119 120 122 128 130 137 138 140 144 145 147 148 154 161

162 173 181 186 188 191 203 204 211

#2 barty@2007-11-12 05:50:00
回复 删除
我的和ls的一样……不知道哪里错了……
#3 weweweer9@2007-12-22 01:10:00
回复 删除
应该让 猫 在题目上加上这句话:选择尽量选择前面的。

这题我数据没弄好,标程是:

#include <cstdlib>

#include <iostream>

#include <cstdio>

#define N 500

#define M 10000

using namespace std;

class fff

{

public:

long num;

char t[N+1];

fff ()

{

memset(t,0,sizeof(t));

num=0;

}

};

fff f[M+1];

short n,m;

short v[N+1],w[N+1];

void dp()

{

for (int i=1;i<=n;i++)

{

for (int j=m;j>=1;j--)

if (j>=v[i])

if (f[j-v[i]].num+w[i]>f[j].num)

{

f[j]=f[j-v[i]];

f[j].num+=w[i];

f[j].t[i]=1;

}

}

}

int main(int argc, char *argv[])

{

// freopen("party.in","r",stdin);

cin >> n >> m;

memset(v,0,sizeof(v));

memset(w,0,sizeof(w));

for (int i=1;i<=n;i++)

{

int s;

cin >> v[i] >> w[i] >> s;

v[i]*=s;

w[i]*=s;

}

dp();

// freopen("party.out","w",stdout);

cout << f[m].num << endl;

short x[N+1];

memset(x,0,sizeof(x));

int j=1;

for (int i=1;i<=n;i++)

if (f[m].t[i]==1)

x[j++]=i;

for (int i=1;i<j-1;i++)

cout << x[i] << " ";

cout << x[j-1];

return EXIT_SUCCESS;

}

如果自己看不懂,到OIBH里找人翻译一下

#4 guoshi3@2008-09-08 05:06:00
回复 删除
大哥你最后为什么不直接return 0.你累不累
#5 Zx.MYS@2008-09-08 05:34:00
回复 删除
orz

return EXIT_SUCCESS;

好标准……

难道是为了系统兼容性?

(可是哪个系统EXIT_SUCCESS不是0啊……- -)

查看更多回复
提交回复