用Java解决装箱问题(贪心算法)

本人是新手,有不对的地方希望大家多多指教!

算法构思:将所输入的物品的体积用一个一维数组保存起来,并对其体积按从大到小的顺序重新排序,用两个一维数组分别用来记录物品是否装箱以及所装箱的序号。之后遍历物品的体积,尽可能先装满一个货箱,在装了物品的前提下看货箱剩余的容量是否还能装下其他的物品,若能,则继续装,若不能,则换另一个货箱,直至所有物品都装入货箱。

代码实现:

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语句进行输出,分享到此结束,请多多指教!

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值