题目: 所有的箱子都是6*6尺寸的,但是物品有1*1,2*2,3*3,4*4,5*5以及6*6尺寸的,要求把所有的物品放进箱子中,求最少需要多少箱子。
思路:对于6*6,5*5以及4*4尺寸的物品每个物品需要占有一个箱子,对于3*3的物品一个箱子可以放4个,2*2的物品箱子可以放9个,1*1的可以放36个。采用面积统计1*1箱子的空位,采用向上取整的方法统计箱子。
解题思路:
先装所有大体积产品:6*6、5*5、4*4、3*3
此时包裹至少a[5]+a[4]+a[3]+(a[2]+3)/4个
装3*3产品的包裹未装满的情况:
只有一个3*3时,还可装2*2的产品5个,同理,数组设为t[]=[0,5,3,1];
余下只考虑剩余空间与2*2、1*1的关系即完成。
java代码如下:
import java.util.ArrayList;
import java.util.Scanner;
public class MainTwo {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int count=0;
int[] a=new int[6];
ArrayList<Integer> list=new ArrayList<Integer>();
while (true) {
for (int i = 0; i < a.length; i++) {
a[i]=scanner.nextInt();
if (a[i]==0) count++;
}
if (count==6) break;
int x=SolveProblem(a);
list.add(x);
count = 0;
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
public static int SolveProblem(int[] a) {
// TODO Auto-generated method stub
int t[]={0,5,3,1};//这是3*3的箱子剩余自己装的时候
int total=0,x,y,n;
total =a[5]+a[4]+a[3]+(a[2]+3)/4; //a5,a4,a3,每个物品占有一个箱子,
//(a3 + 3 ) / 4 代表a3的物品需要占
x=t[a[2]%4]+5*a[3];//剩余空间可装2*2的个数
//剩余空间不够装2*2时,需要另加包裹
if (a[1]>x) {
total+=(a[1]-x+8)/9;
}
//此时包裹剩余空间,可以装1*1的包裹
n=36*total-36*a[5]-25*a[4]-16*a[3]-9*a[2]-4*a[1];
if(a[0]>n){
total+=(a[0]-n+35)/36;
}
return total;
}
}