枚举算法

枚举算法的基本思想

  • 枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。
  • 枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。
  • 枚举结构:循环+判断语句。

枚举法的优缺点

枚举算法的优点:

  1. 由于枚举算法一般是现实生活中问题的“直译”,因此比较直观,易于理解
  2. 由于枚举算法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明

枚举算法的缺点:

枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较低。

使用枚举法解题的基本思路:

  1. 确定枚举对象、范围和判定条件。
  2. 逐一枚举可能的解并验证每个解是否是问题的解。

枚举算法实例:

砝码称重:

题目:

【问题描述】设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),求用这些砝码能称出不同的重量个数。

【文件输入】输入1g、2g、3g、5g、10g、20g的砝码个数。

【文件输出】输出能称出不同重量的个数。

【样例输入】1 1 0 0 0 0

【样例输出】3

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;

public class 砝码称重 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] a = new int [1001];
int[] b = new int [7]; //用来存放各个砝码的个数
int[] c = {0, 1, 2, 3, 5, 10, 20};
int[] arr = new int [7];
for(int i=1; i<b.length; i++)
b[i] = sc.nextInt();
for(arr[1]=0; arr[1]<=b[1]; arr[1]++)
for(arr[2]=0; arr[2]<=b[2]; arr[2]++)
for(arr[3]=0; arr[3]<=b[3]; arr[3]++)
for(arr[4]=0; arr[4]<=b[4]; arr[4]++)
for(arr[5]=0; arr[5]<=b[5]; arr[5]++)
for(arr[6]=0; arr[6]<=b[6]; arr[6]++) {
int sum=0;
for(int i=1; i<=6; i++) {
sum+=arr[i]*c[i];
a[sum]=1;
}
}
int num = 0;
for(int i=1; i<=1000; i++) {
if(a[i] == 1)
num++;
}
System.out.println(num);
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!