题目:礼物盒
小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如图。
小y 还有 36 个礼物盒,他们的深度都为 1cm。他们对应的宽度和高度如下,单位(cm)。
11 3
8 12
11 17
16 13
1 14
2 8
6 10
10 18
17 11
10 15
6 14
5 6
2 19
19 10
4 9
7 9
5 14
5 20
15 19
3 17
15 11
7 25
11 20
9 12
17 4
9 19
4 18
10 10
12 19
17 3
19 9
20 16
11 16
10 2
20 15
3 14
现在小y 想把这些盒子放到柜子上,由于礼物盒里面都装有礼物,礼物盒必须向上放置,并且不能堆放。由于礼物盒深度和柜子深度一样,所以礼物盒和柜子深度方向也必须一致。并且礼物盒的高度还不能大于柜子的高度,否者放不进去。小y 希望放到柜子上礼物盒的宽度和正好等于柜子的宽度,也就是希望柜子两边都不存在间隙。如下图符合条件的放置。
满足条件的情况下,小y 希望能尽可能多的放置礼物盒,算出最多能放多少个礼物盒。
思路:
背包类型的问题,可以先对盒子排一次序然后贪心搜索,搜到的第一个结果就是最多能放的礼物盒数
代码:
public class Main {
private static int[] w={11, 8, 11, 16, 1, 2, 6, 10, 17, 10, 6, 5, 2, 19, 4, 7, 5, 5, 15, 3, 15, 11,
9, 17, 9, 4, 10, 12, 17, 19, 20, 11, 10, 20, 3 };
public static void main(String[] args) {
// TODO Auto-generated method stub
Arrays.sort(w);
dfs(0,100,0);
}
private static boolean dfs(int k,int len,int n) {
// TODO Auto-generated method stub
if(len==0){
System.out.println(n);
return true;
}
if(k==w.length||len<0){
return false;
}
for(int i=k;i<w.length;i++){
if(dfs(i+1,len-w[i],n+1)){
return true;
}
}
return false;
}
}