有30人,可能包括男人、女人、小孩,他们在一饭店共消费50先令,其中每个男人花3先令, 每个女人花2先令,每个小孩花1先令,求男人、女人、小孩各多少人? (此题就是换了个名词的百钱买百鸡) 这是个基础题,但是我经常学到后面忘记前面这种需要带点脑子的基础题,所以写做了一期笔记。
我总结了两个方法:
方法1:
先思考男人,女人,小孩一共可能有多少人。
男人一共有:50块钱除以3块每人, 也就是50 / 3 (向下取整)个人
女人一共有:50块钱除以2块每人, 也就是50 / 2 (向下取整)个人
小孩一共有:30个人
但是这样算,不能单靠某一种人撑满50块人数还满足刚好30人的,所以需要组合。
用循环判断,循环中会从内层开始计算可行方案,如第一次循环,男人是0个,女人是0个,小孩是30个,但是价格不满足;
进入第二层,男人0个,女人1个,小孩30个,依然不满足;以此类推。。。
一直到有一种方案同时满足人数和价格,就输出该方案。
代码如下:
private static void fun1() {
int num = 30;
int money = 50;
int man = 3;
int woman = 2;
int child = 1;
// 从男人开始循环(可行)
for (int i = 0; i <= 50 / 3; i++) {
for (int j = 0; j <= 50 / 2; j++) {
for (int k = 0; k <= 30; k++) {
if (i + j + k == num && i * 3 + j * 2 + k == money) {
System.out.println("男人有:" + i + "人,女人有:" + j + "人,小孩有:" + k + "人");
}
}
}
}
// 从小孩开始循环(可行)
// for (int i = 0; i <= 30; i++) {
// for (int j = 0; j <= 50 / 2; j++) {
// for (int k = 0; k <= 50 / 3; k++) {
// if (i + j + k == num && i + j * woman + k * man == money) {
// System.out.println("小孩有:" + i + "人,女人有:" + j + "人,男人有:" + k + "人");
// }
// }
// }
// }
// 从女人开始循环(可行)
// for (int i = 0; i <= 50 / 2; i++) {
// for (int j = 0; j <= 50 / 3; j++) {
// for (int k = 0; k <= 30; k++) {
// if (i + j + k == num && i * 2 + j * 3 + k == money) {
// System.out.println("女人有:" + i + "人,男人有:" + j + "人,小孩有:" + k + "人");
// }
// }
// }
// }
}
(经过检验,发现无论是谁在外层循环,谁在内层循环都可以,只要注意if条件人和价格对应上就可以)。
方法2:
此方法是从总人数上开始逐层递减,来判断方案的(原理和方法1大同小异,但是代码上略有不同)
依然是三层循环,(循环层数的顺序没有关系)
这里第一层循环判断男人,如果男人的数量 * 男人消费的价格 > 总金额,就代表男人已经超过上限了,以此来结束循环。第二层以此类推。
跟着思路走一遍:第一次循环,男人是0,女人是0,小孩那层判断,如果男人+女人+小孩一共30人,并且价格是50,则输出,否则进入下一层循环。
第二层,男人是0,女人是1,小孩的最大值就只能是29了。第三层,男人是0,女人是2,小孩最大值就是28。以此类推。
外层循环每增加一个人,内层循环就要减去一个人,最后最内层判断是否满足条件。
代码如下:
private static void fun2() {
int num = 30;
int money = 50;
int man = 3;
int woman = 2;
int child = 1;
for (int i = 0; i <= num; i++) {
if (i * man > money) {
continue;
}
for (int j = 0; j <= num - i; j++) {
if (j * woman + i * man > money) {
continue;
}
for (int k = 0; k <= num - i - j; k++) {
if (k * child + j * woman + i * man == money && k + j + i == num) {
System.out.println("男人有:" + i + "人,女人有:" + j + "人,小孩有:" + k + "人");
}
}
}
}
}
这两种方法运行后的结果为:
根据测试,方法可行。
(以后在遇到类似百钱买百鸡的题不会了就回来看看。)
标签:小孩,买百鸡,百钱,50,int,循环,money,延伸,男人 From: https://www.cnblogs.com/Xyer/p/17347487.html