本人是新手,有不对的地方希望大家多多指教!
算法构思:将所输入的物品的体积用一个一维数组保存起来,并对其体积按从大到小的顺序重新排序,用两个一维数组分别用来记录物品是否装箱以及所装箱的序号。之后遍历物品的体积,尽可能先装满一个货箱,在装了物品的前提下看货箱剩余的容量是否还能装下其他的物品,若能,则继续装,若不能,则换另一个货箱,直至所有物品都装入货箱。
代码实现:
package zhuangzai;
import java.util.Scanner;
public class zhuangzai
{
public static int[] sort_a(int[] x)//排序
{
for(int i=1;i<=x.length-2;i++)
{
for(int j=i+1;j<=x.length-1;j++)
{
if(x[i]<x[j])
{
x[0] = x[i];
x[i] = x[j];
x[j] = x[0];
}
}
}
return x;
}
public static void main(String []args)
{
int RV;//货箱剩余容量
int []a = new int[20];//是否装箱
int []b = new int[20];//物品所装箱的序号
int num=0;//所用货箱个数
Scanner scanner = new Scanner(System.in);
System.out.print("货箱的容量为: ");
int V = scanner.nextInt();//货箱容量
System.out.print("物品的件数为: ");
int n = scanner.nextInt();//物品件数
System.out.println("每件物品的体积为: ");
int []c= new int[n+1]; //物品的体积
for(int i=1;i<=n;i++)
{
c[i]=scanner.nextInt();
}
for(int i=1;i<=n;i++)
{
a[i]=0;//所有物品都未装入货箱
}
c = sort_a(c);
System.out.println("排序后的数组为:");
for(int i=1;i<=n;i++)
{
System.out.print(c[i]);
System.out.print(" ");
}
RV=V;//未装时剩余容量等于容量
num=1;//刚开始装箱的序号
for(int j=1;a[j]==0;j++)
{
for(int i=1;i<=n;i++)
{
if(RV>=c[i] && a[i]!=1)//剩余容量大于当前物品体积,同时物品还未装箱
{
RV-=c[i];
b[i]=num;//记录物品所装货箱的序号
a[i]=1;//标记当前物品已装箱
i=1;//保证每次装箱时都从体积最大的开始遍历,防止发生遗漏
}
if(RV<c[n])//剩余容量小于物品中体积最小的物品时换箱,并将剩余容量置于货箱的容量
{
num++;
RV=V;
}
}
int m=0;
for(int i=1;i<=n;i++)
{
if(a[i]==1)
m++;//记录已装入货箱的物品的个数
}
if(m==n)//若全部装箱,则终止循环
break;
else if(a[j]==0)
j=1;//保证不会发生漏装
}
System.out.println();
System.out.println("至少需要货箱的个数为: "+ num);
System.out.println("物品所对应的货箱序号分别为: ");
for(int j=1;j<=n;j++)
{
System.out.print(b[j]);//输出排列后的物品所装货箱的序号
System.out.print(" ");
}
}
}
执行结果:
代码中的排序可以直接引用包,因为想练习一下所以我没直接引用,如果想得到每个货箱的剩余容量还可以再后面添加for语句进行输出,分享到此结束,请多多指教!