Poj 1017 Packets(贪心策略)

一、题目大意:

    一个工厂生产的产品用正方形的包裹打包,包裹有相同的高度h和1*1, 2*2, 3*3, 4*4, 5*5, 6*6的尺寸。这些产品经常以产品同样的高度h和6*6的尺寸包袱包装起来运送给客户。工厂和客户最关心的就是尽量使用少的包裹来运送客户定的产品以减少费用。一个能计算运送产品所需最少包裹的程序能节约很多钱。你的任务就是编写这个程序。

输入:

输入文件包含若干行订单,每行表示一个订单。一个订单包含六个整数,用空格分开,表示产品尺寸对应的包裹个数,从最小尺寸1*1,到最大尺寸6*6,最后一行六个零表示输入结束。

输出:

输出文件一行对应输入文件的一行。这一行表示对应输入文件行订单所需最小的包裹数。对输入文件最后一行不用处理。

二、吐槽

        在没有看到翻译之前,小弟真不知道题目什么意思。星幸亏有这位大哥的翻译啊,谢谢大哥啊,你的英语真好。

三、题解

        这道题有用到贪心策略:

  •   对于尺寸为6的包裹很简单,只要所求结果加尺寸为6个数即可。
  •   对于尺寸为5的包裹的的话,1个最多只能填充11个尺寸为1 的包裹,所以所求结果加上5的个数,然后再用尺寸为1的包裹减去填充进尺寸为5的包裹即可。这里要注意尺 寸为1 的包裹数和填充的包裹数的数量不一,所以,在减的时候要减去尺寸为1 的包裹数和需要的最多填充数两者的最小值。
  •  对于尺寸为4的包裹而言呢,即可填充尺寸为2的包裹也可以填充尺寸为1的包裹。这里采用贪心策略,首先先用尺寸为2的包裹填充,再用尺寸为1的包裹填充。这里最麻烦 的就是,2填充了多少,1又填充了多少。所以,专门写一个函数用于解决这个问题。这里是我一直很纠结的地方,后来参考了大神的方法,确实简单高效。
  •  对于尺寸为3的包裹,情况和尺寸为4的差不多,不过它更复杂一点,因为它可以只填充它本身。所以就分为,它自身只有1、2、3的三种情况。
  • 尺寸为2和1的情况相对简单一点。

        

四、java代码

import java.util.Scanner; 

public class Main {
	static int [] a=new int[7];;
	public static void deal(int x,int y){
		y-=Math.min(a[2],x)*4;
		a[2]-=Math.min(a[2],x);
		a[1]-=Math.min(a[1],y);
	}
    public static void main(String[] args) { 
       Scanner cin = new Scanner(System.in);
       int i,sum,temp,x = 0,y = 0;
       while(cin.hasNext()){
    	   int total=0;
    	   for(i=1;i<=6;i++){
    		   a[i]=cin.nextInt();
    		   total+=a[i];
    	   }
    	   if(total==0)
    		   break;
    	   sum=a[6]+a[5]+a[4];
    	   a[1]-=Math.min(a[1], a[5]*11);
    	   deal(a[4] * 5,a[4] * 20);
    	   sum+=(a[3]+3) / 4;
    	   temp=a[3] % 4;
    	   switch(temp){
    	   case 0: x=0;y=0;break;
    	   case 1: x=5;y=27;break;
    	   case 2: x=3;y=18;break;
    	   case 3: x=1;y=9;break;
    	   }
    	   deal(x,y);
    	   sum+=(a[2]+8) /9;
    	   if(a[2]%9!=0){
    		   y=(9 - a[2] % 9) *4;
    	   }else
    		   y=0;
    	   deal(0,y);
    	   sum+=(a[1]+35) /36;
    	   System.out.println(sum);
       }
    } 
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/AndyDai/p/4734174.html