noip2001第4题 装箱问题
答案:4 悬赏:50 手机版
解决时间 2021-04-28 03:18
- 提问者网友:藍了天白赴美
- 2021-04-27 19:53
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30=,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
样例 在这里
样例输入 Sample Input
24
6
8
3
12
7
9
7
样例输出
0
高手们帮忙看看 我知道是0-1背包问题,我学的是free pascal 语言,给一下各位高手的程序,指导一下!!!
最佳答案
- 五星知识达人网友:毛毛
- 2021-04-27 21:19
program lxy(input,output);
var v:array[0..20000] of boolean;
w:array[0..30] of integer;
vsum,n,m,i,j:integer;
begin
fillchar(v,sizeof(v),false);
v[0]:=true;
readln(vsum);
readln(n);
for i:=1 to n do readln(w[i]);
for i:=1 to n do
for j:=vsum downto w[i] do
if v[j-w[i]] then v[j]:=true;
for i:=vsum downto 0 do
if v[i] then
begin
writeln(vsum-i);
break;
end;
end.
v[i]表示体积为i时是否可以装满 程序应该容易看懂吧=。=
全部回答
- 1楼网友:行路难
- 2021-04-28 00:29
这是最基础的01背包问题,给你个程序吧:
program dd; var a:array[0..20000] of longint; i,j,n,v,t:longint; begin readln(v);readln(n); fillchar(a,sizeof(a),0); for i:=1 to n do begin readln(t); for j:=v-t downto 0 do if a[j]+t>a[j+t] then a[j+t]:=a[j]+t; end; writeln(v-a[v]); end.- 2楼网友:慢性怪人
- 2021-04-27 22:53
你的j循环有点问题,照你的程序来看,会导致同一个物品反复装进箱子里面比如:假设有一件物品体积为1,那么你的箱子就被装满了能过的那个点可能是你运气好吧
- 3楼网友:何以畏孤独
- 2021-04-27 21:35
var i,j,k,m,n,t:longint; a,f:array[0..20000]of longint;
begin readln(m);readln(n); for i:=1 to n do readln(a[i]);
f[0]:=1; for i:=1 to n do for j:=m downto a[i] do if f[j-a[i]]=1 then f[j]:=1;
for i:=m downto 1 do if f[i]=1 then begin writeln(m-i);halt;end; end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯