装箱问题

原创 2006年06月20日 14:45:00

  装箱问题
[问题描述]
有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0≤n≤30),每个物品有一个体积(正整数)。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

[样例]

输入:  24     一个整数,表示箱子容量
         6     一个整数,表示有n个物品
         8     接下来n行,分别表示这n个物品的各自体积。
         3
        12
         7
         9
         7

输出:   0     一个整数,表示箱子剩余空间

算法分析
本题是经典问题:0-1背包的特殊例子(加强了已知条件)。用整形数组volume存储各件物品的体积,用布尔型函数h(i,k)表示前i个物品通过组合能否恰好装满容量k的空间,则考虑第i件物品,如果没有被选中,则问题转化为h(i-1,k);如果第i件物品被选中了,则问题转化为h(i-1,k-volume[i]),因此有如下的表达式:
h(i,k)=h(i-1,k-volume[i]) || h(i-1,k);

   k从V开始递减,判断h(n,k)是否为真,第一个符号要求的k即为剩余空间最小时消耗的体积。
   如果此时直接编写程序,就要定义一个二维数组,空间复杂度时n*v,注意到了n,v的取值范围很大,所以用二维数组存储就会有问题。


    我们注意到,h(i,k)的取值仅与h(i-1,0)~h(i-1,k)有关,且如果h(i-1,k)=true,必然有h(i,k)=true,h(i,k)的值存在继承性,而程序结束时,我们也只关心h(n,k),因此,我们可以用一维数组h(k)来存储中间信息。为了避免重复计算,可以让k从大到小变化,为了避免出现负数,k的变化范围为v~volume[i].

示例程序:

#include<iostream>
#include<cstring>
using namespace std;
int v,n;
int volume[31];//存储n件物品的体积
int h[20001];//h[i]=1,表示n件物品通过某种组合,所构成的体积和正和等于i;
             //h[i]=0,表示n件物品无论如何组合,体积和都无法等于i
int main()
 {
     freopen("in.txt","r",stdin);
     freopen("out.txt","w",stdout);
     int v,n,i,j,k;
     while(cin>>v>>n)
      {
          for(i=1;i<=n;i++)
           cin>>volume[i];
          memset(h,0,sizeof(h));
          h[0]=1;
          for(i=1;i<=n;i++)
           for(k=v;k>=volume[i];k--)
            h[k]=h[k]||h[k-volume[i]];
          j=v;
          while(j>0&&h[j]==0)
            j--;
          cout<<v-j<<endl;    
      }   
     return 0;
 }    

例题:装箱问题

问题描述 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有6个型号,它们的长度和宽度分别是1X1,2X2,3X3,4X4,5X5,6X6。这些产品通常使用一个6X6Xh的长方...
  • Coder__CS
  • Coder__CS
  • 2016年06月16日 11:21
  • 1322

装箱问题(NP问题)

问题描述有n个物品,体积为 v[i],i = 1..n。 现在有若干同样的箱子,体积为C,C > v[i], i = 1..n。问最少需要多少箱子,才能装下所有的物品。问题求解这类问题是NP问题,即可...
  • nisxiya
  • nisxiya
  • 2015年05月06日 11:30
  • 2177

[NOIOJ19]装箱问题 贪心算法

题目在这儿这题思路很明了,无非是更多地利用空间,尽可能少地空出空位。 不妨设1*1、2*2、3*3、4*4、5*5、6*6的长方体数量分别为c1、c2、c3、c4、c5、c6c_1、c_2、c_3、...
  • ccf15068475758
  • ccf15068475758
  • 2016年10月28日 18:28
  • 796

贪心算法之装箱问题

问题描述:     有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中,使占用的箱子数尽量少。 贪心算法中要求每一步的解都是当前步骤中的最优解。原问...
  • Panda_m
  • Panda_m
  • 2014年11月29日 20:41
  • 4895

三维装箱问题Java代码的简单实现过程

**三维装箱问题Java代码的简单实现过程**                        时间:2016年7月                         作者:竹林春雨        ...
  • chun0
  • chun0
  • 2016年07月06日 10:48
  • 3649

装箱问题近似算法概述

问题描述:一维经典装箱问题可描述如下:S=(S1,S2,..Sn),其中0< Si ≤ 1, 称之为第i个物体的体积(或重量),1≤i≤n,现有n个容积(或载重量)为1 的箱子,要求如何设法将S1,S...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年07月05日 19:52
  • 2700

算法导论最后一章《近似算法》习题“装箱”问题求解

这个装箱问题的问题描述类似:http://bbs.csdn.net/topics/300089315 或者这个问题  http://zhidao.baidu.com/question/71143327...
  • zhangnaigan
  • zhangnaigan
  • 2014年08月02日 22:59
  • 1095

算法/贪心算法/BinPacking一维装箱问题

问题描述We have a number of bins each with a capacity of 1, and we have a set of objects all with differ...
  • Carinya
  • Carinya
  • 2017年04月25日 20:00
  • 1446

PAT 2-09 装箱问题模拟(C语言实现)

题目描述: 假设有N项物品,大小分别为s1, s2, …, si, …, sN,其中si为满足1i...
  • wutongyu0113
  • wutongyu0113
  • 2014年10月02日 19:52
  • 1335

贪心算法应用之一:装箱问题

关于贪心算法: 即通过保证局部最优来求得最优解的一种思维。 关键在于:设置贪心准则。贪心准则一旦确定,中途不能改变。 装箱问题描述、分析、代码实现...
  • zhangdoudou0626
  • zhangdoudou0626
  • 2015年12月16日 12:36
  • 2527
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装箱问题
举报原因:
原因补充:

(最多只允许输入30个字)