回 帖 发 新 帖 刷新版面

主题:装箱问题 ++分

谁能教教我怎样用动态规划解装箱问题?? 具体思路是什么?

回复列表 (共15个回复)

沙发

题目说清楚

板凳

yes

3 楼

给出一个箱子体积和n各物品的体积,求怎样装箱能使箱子的剩余空间最小,这一道题很经典,我已经想通了,但还是希望和大家交流一下

4 楼

const
  maxn = 1000;
var
  n,i:longint;
  h:array[0..maxn] of longint;  
  sum:array[0..maxn] of longint; { sum[k]=h[1]+h[2]+...h[k] }

  begin
      read(n);
    for i:=1 to n do
    begin
      h[i]:=1 + sum[i div 2];
      sum[i]:=sum[i-1]+h[i];
    end;
    writeln(h[n]);
  end.
是不是啊?

5 楼

程序要读入n个箱子的体积的
4楼好像没有读

6 楼

program Sbag;
const maxn=10;
      maxv=100;
var f0,f1:array[1..maxv]of boolean;
    box:array[1..maxn]of integer;
    v,n,i,j:integer;
begin
    read(v,n);
    for i:=1 to n do read(box[i]);
    fillchar(f0,sizeof(f0),0);
    f0[0]:=true;
    for i:=1 to n do
      begin
        f1:=f0;
        for j:=box[i] to v do
          if f0[j-box[i]] then f1[j]:=true;
        f1:=f0;
      end;
    for i:=v downto 1 do
      if f1[i] then
        begin
          writeln(v-i);
          halt
        end;
end.

就对了

7 楼


8 楼

用什么语言编的啊,是C吗??[em8]

9 楼

我把它当0-1背包来做,好象也行
program ex;
  var
    v,n,i,j:Integer;
    f:array[0..30,0..20000]of integer;
    m:array[1..30]of integer;
  begin
    fillchar(f,sizeof(f),0);
    readln(v);
    readln(n);
    for i:=1 to n do
      readln(m[i]);
    for i:=1 to n do
      for j:=1 to v do
        begin
          f[i,j]:=f[i-1,j];
          if j-m[i]>=0 then begin
            if m[i]+f[i-1,j-m[i]]>f[i,j] then
              f[i,j]:=m[i]+f[i-1,j-m[i]];
          end;
        end;
    writeln(v-f[n,v]);
  end.

10 楼

我来吧````这简单```
   const maxn=30;
         maxv=20000;
var i,k,n,v:integer;
    volume:array[1..maxn] of integer;
    h:array[0..maxv] of boolean;
begin
  read(v,n);
  for i:=1 to n do read(volume[i]);
  fillchar(h,sizeof(h),false);
  h[0]:=false;
  for i:=1 to n do 
   for k:=v downto volume[i] do
     h[k]:=h[k] or h[k-volume[i]];
  i:=v;
  while (i>0) and (not(h[i])) do i:=i-1;
  writeln(v-i);
end.
    小弟虽然垃圾,但解决这些题还是行的

我来回复

您尚未登录,请登录后再回复。点此登录或注册