Java数据结构与算法——穷举法

一、穷举法

穷举算法,依赖计算机强大的计算能力,来穷举每一种可能的情况,以达到解决问题的目的,也叫枚举法、暴力破解法。

基本思想———逐一列举问题所涉及的所有情形,并根据问题提出的条件进行检验从而找到可能的解 。

方法步骤———确定枚举对象、枚举范围、判断条件;循环验证每一个解。

二、案例

案例一——队伍名次

甲 、乙、丙 三位球迷分别预测进入半决赛的四队A、B、C、D的名次如下:
甲:A 第一名 、B 第二名
乙:C 第一名 、D 第三名
丙:D第一名 、 A 第三名
设比赛结果,四队互不相同,并且甲乙丙的预测各对一半,求A、B、C、D队的名次?

令变量 a,b,c,d 分别为四个名次。甲乙丙的预测各对一半,即两个预测结果只有一个成立。以甲的预测为例,即(a == 1)&&(b != 2)|| (a != 1)&&(b == 2)。

代码如下:

public class teamRanking {
	
	public static void main(String[] args) {
		int a, b, c, d;
		boolean t;
		// 循环,列出所有的可能
		for (a = 1; a <= 4; a++) {
			for (b = 1; b <= 4; b++) {
				if(a == b)// 如果两队名次相同,跳出本次循环
					continue;
				for (c = 0; c <= 4; c++) {
					if(c == a || c == b)// 如果两队名次相同,跳出本次循环
						continue;
					d = 10 - a - b -c;// 四个队,名次之和为10
					// 甲乙丙的预测
					t = (a == 1 && b != 2 || a != 1 && b == 2) &&
						(c == 1 && d != 3 || c != 1 && d == 3) && 
						(d == 1 && a != 3 || d != 1 && a == 3);
					if(t){
						System.out.println("四队的名次为:");
						System.out.println("A=" + a + ", B=" + b +
								", C=" + c  + ", D=" + d);
					}
				}
			}
		}
	}

}

测试结果:

四队的名次为:
A=3, B=2, C=1, D=4

案例二——鸡兔同笼

问题:一个笼子有35个头,94只脚,问鸡和兔各有多少?

分析:设有鸡 x 只,兔 y 只,则有 x + y = 35 和 2x + 4y = 94。由 x + y = 35 可知 x、y 的定义域分别为 x ∈ [ 0 , 35 ] , y ∈ [ 0 , 35 ] x \in [0,35],y \in[0,35] x[0,35],y[0,35]

可以直接以两个定义域建立循环进行计算,但 y 的定义域可以进行优化缩小。假设笼中全是兔子,则最多有 94 ÷ 4 = 23 94 \div 4 = 23 94÷4=23 只,所以可将 y 优化为 y ∈ [ 0 , 23 ] y \in[0,23] y[0,23]

代码如下:

public class chickenAndRabbit {

	public static void main(String[] args) {
		for (int x = 0; x <= 35; x++) {
			for (int y = 0; y <= 23; y++) {
				if (x + y == 35 && 2 * x + 4 * y == 94)
					System.out.println("x = " + x + ", y = " + y);
			}
		}
	}

}

测试结果:

x = 23, y = 12

案例三——水仙花数

水仙花数(Narcissistic number)是指一个三位数,其各位数字的立方和等于其本身。例如, 153 = 1 3 + 5 3 + 3 3 153 = 1^3 + 5^3 + 3^3 153=13+53+33,所以 153 就是一个水仙花数。

使用穷举法,遍历 100 ~ 999 所有的三位数,用水仙花数的条件进行判断,从而选出水仙花数。

代码如下:

public class narcissisticNumber {
	
	public static void main(String[] args) {
		int number;
		int sum = 0;
		int i, j, k; // i j k 分别表示 number 的百位、十位、个位
		for (number = 100; number < 1000; number++) {
			i = number / 100;
			j = (number - i * 100) / 10;
			k = number - i * 100 - j * 10;
			sum = i * i * i + j * j * j + k * k * k;
			if (sum == number)
				System.out.println(number + " is a narcissistic number! ");
		}
	}

}

测试结果:

153 is a narcissistic number! 
370 is a narcissistic number! 
371 is a narcissistic number! 
407 is a narcissistic number! 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构算法设计项目01背包问题是指在算法设计与分析课程中,学生需要解决一个背包问题。该问题要求在给定的一组物品和背包容量的情况下,选择一些物品放入背包中,使得被选中物品的总价值最大化,同时保证它们的总重量不超过背包的容量。 在数据结构算法课程设计实验中,学生通常会进行一系列实践项目,比如定时/计数技术应用程序设计、图形变换程序设计、代码转换程序设计等。这些项目旨在帮助学生巩固和应用所学的数据结构算法知识,提高他们的编程能力和解决实际问题的能力。在解决01背包问题的项目中,学生需要设计和实现一个算法,以有效地选择物品放入背包,从而达到最优化的目标。 为了解决01背包问题,学生可以使用动态规划算法。这种算法通过建立一个二维数组来存储子问题的解,并利用子问题的解来构建更大规模的问题的解。具体来说,学生可以先初始化一个二维数组,然后使用循环遍历物品和背包容量的组合,并根据当前物品的重量和价值来更新数组中对应位置的值。通过动态规划算法,学生可以找到最优解,即选择哪些物品放入背包以达到最大的总价值。 除了动态规划算法,学生还可以尝试其他的算法来解决01背包问题,比如贪心算法和回溯算法。贪心算法通过选择当前最优解来构建整体最优解,而回溯算法则通过穷举所有可能的解来找到最优解。每种算法都有其优缺点,学生可以根据实际情况选择合适的算法来解决01背包问题。 总之,数据结构算法设计项目01背包问题是一个让学生应用所学知识解决实际问题的项目。学生可以使用动态规划算法或其他算法来解决该问题,并通过编程实践提高自己的算法设计和分析能力。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [算法设计与分析课程的背包问题](https://download.csdn.net/download/you_best_honor/12924018)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [数据结构算法课程设计报告](https://download.csdn.net/download/nibashangtian/10164603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值