餐厅有6,8人座的桌子,求 n 个人最少需要多少张桌子才能坐满(若有桌子未坐满返回-1)

做题思路:暴力深搜找规律

我们可以用暴力递归的方法打印出 1~100 的结果,然后通过递归结果总结出规律,从而优化时空复杂度

暴力递归:

static int dfs(int n){
	if(n == 6 || n == 8){
		return 1;
	}
	if(n % 2 != 0 || n < 8){
		return -1;
	}
	int a = dfs(n-6);
	int b = dfs(n-8);
	int min = Integer.MAX_VALUE;
	if(a != -1){
		min = Math.min(min, a);
	}
	if(b != -1){
		min = Math.min(min, b);
	}
	int ans = min == Integer.MAX_VALUE ? -1 : min+1;
	return ans;
}

枚举1~100,调用 dfs 可以得到以下结果:

1 -1
2 -1
3 -1
4 -1
5 -1
6 1
7 -1
8 1
9 -1
10 -1
11 -1
12 2
13 -1
14 2
15 -1
16 2
17 -1
18 3
19 -1
20 3
21 -1
22 3
23 -1
24 3
25 -1
26 4
27 -1
28 4
29 -1
30 4
31 -1
32 4
33 -1
34 5
35 -1
36 5
37 -1
38 5
39 -1
40 5
41 -1
42 6
43 -1
44 6
45 -1
46 6
47 -1
48 6
49 -1
50 7
51 -1
52 7
53 -1
54 7
55 -1
56 7
57 -1
58 8
59 -1
60 8
61 -1
62 8
63 -1
64 8
65 -1
66 9
67 -1
68 9
69 -1
70 9
71 -1
72 9
73 -1
74 10
75 -1
76 10
77 -1
78 10
79 -1
80 10
81 -1
82 11
83 -1
84 11
85 -1
86 11
87 -1
88 11
89 -1
90 12
91 -1
92 12
93 -1
94 12
95 -1
96 12
97 -1
98 13
99 -1

可以容易的看到从 18 开始,后面的数每 8 个都可以分为一组,根据此总结出优化的做法:

//根据得到的规律退出公式
static int good(int n){
	if(n % 2 != 0){
		return -1;
	}
	if(n < 18){
		if(n == 6 || n == 8){
			return 1;
		}else if(n == 12 || n == 14 || n == 16){
			return 2;
		}
	}else{
		return (n-18)/8 + 3;
	}
	return -1;
}

 

 

 

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值