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.
会不会是有多种情况咯~~
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
这题我数据没弄好,标程是:
#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里找人翻译一下
return EXIT_SUCCESS;
好标准……
难道是为了系统兼容性?
(可是哪个系统EXIT_SUCCESS不是0啊……- -)