回 帖 发 新 帖 刷新版面

主题:求各位大牛教教我这个背包

有n件物品(编号依次为1~n)和m只相同的背包,每件物品的重量分别为w[i],每只最大背包承重为t。把尽可能多的物品放进背包里。
要求是:
1.     一件物品不能拆开放在两个或更多的背包里;
2.     物品必须编号顺序放进背包里,也就是说如果把第i件物品放进某个背包后,就不能再把编号小于i的物品放进任何背包。
输入文件
第一行,三个整数:n,t,m
第二行,n个整数,按编号给出每件物品的重量w[i]
输出文件
一个整数,表示最多可以装进m只背包里的物品数量。
样例输入:
4 5 2
4 3 4 2
样例输出:
3

回复列表 (共4个回复)

沙发

已有稿,明天贴. 幸亏这个不是noip背包问题..

板凳

审错题了.其实是..变异版.
直接在网上搜到答案贴了..

改进的状态表示描述为:
g[i,j]=(a, b),0≤i≤n,0≤j≤i,0≤a≤m,0≤b≤t,表示在前i件武器中选取j件所需的最少背包为:a个背包另加b容量。
状态转移方程为:
g[i, j]=min{g[i-1,j],g[i-1,j-1]+long[i]} 
其中(a, b)+long[i]=(a’, b’)的计算方法为:
当b+long[i] ≤t时: a’=a;       b’=b+long[i];
当b+long[i] >t时: a’=a+1;   b’=long[i];
规划的边界条件:
当0≤i≤n时,g[i,0]=(0,0) 
题目所求的最大值是:answer=max{k| g[n, k]≤(m-1,t)} 
可用f[i,j]=a,g[i,j]=b来做
详见:动态规划算法的优化技巧---2001毛子青论文

3 楼

var n,m,i,j,n2,vv,ww,p,tt:longint;
    w,v,t:array[1..1000] of longint;
    // t:jian shu
    f:array[0..100000] of longint;
begin
  readln(n,m); n2:=0;
  for i:=1 to n do
    begin
    read(ww,vv,tt); p:=1;
    while tt>=p do
      begin
      inc(n2); w[n2]:=p*ww; v[n2]:=p*vv;
      tt:=tt-p;
      p:=p shl 1;
      end;
    if tt<>0 then
      begin
      inc(n2); w[n2]:=tt*ww; v[n2]:=tt*vv;
      end;
    end;
  n:=n2;
  for i:=0 to m do f[i]:=0;
  for i:=1 to n do
    for j:=m downto w[i] do
      if f[j]<f[j-w[i]]+v[i] then
        f[j]:=f[j-w[i]]+v[i];
  writeln(f[m]);
end.

直接贴上.

4 楼

卖广告的么?楼上.

我来回复

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