编程小思想

204 阅读4分钟

## 暴力破解法

对于情况有限的问题,可以使用暴力破解方法。

对有限的问题,加以条件筛选。即可得到想要的数据。

## 枚举与剪枝

剪枝:为了让计算机避免一些无用的,徒劳的动作。


### 找零方案 8元找零方案

#### 暴力破解

```
function getWay(num) {
	var num = num * 10
	for (var i = 0; i <=num / 50; i++) {
		for (var j = 0; j <= num / 20; j++) {
			for (var k = 0; k <= num / 10; k++) {
				for (var m = 0; m <= num / 5; m++) {
					if (i * 50 + j * 20 + k * 10 + m * 5 == num) {
						console.log('i=>' + i + 'j=>' + j + 'k=>' + k + 'm=>' + m)
					}
				}
			}
		}
	}
}
getWay(8)

result:
i=>0j=>0k=>0m=>16
i=>0j=>0k=>1m=>14
i=>0j=>0k=>2m=>12
i=>0j=>0k=>3m=>10
i=>0j=>0k=>4m=>8
i=>0j=>0k=>5m=>6
i=>0j=>0k=>6m=>4
i=>0j=>0k=>7m=>2
i=>0j=>0k=>8m=>0
i=>0j=>1k=>0m=>12
i=>0j=>1k=>1m=>10
i=>0j=>1k=>2m=>8
i=>0j=>1k=>3m=>6
i=>0j=>1k=>4m=>4
i=>0j=>1k=>5m=>2
i=>0j=>1k=>6m=>0
i=>0j=>2k=>0m=>8
i=>0j=>2k=>1m=>6
i=>0j=>2k=>2m=>4
i=>0j=>2k=>3m=>2
i=>0j=>2k=>4m=>0
i=>0j=>3k=>0m=>4
i=>0j=>3k=>1m=>2
i=>0j=>3k=>2m=>0
i=>0j=>4k=>0m=>0
i=>1j=>0k=>0m=>6
i=>1j=>0k=>1m=>4
i=>1j=>0k=>2m=>2
i=>1j=>0k=>3m=>0
i=>1j=>1k=>0m=>2
i=>1j=>1k=>1m=>0




```

### 剪枝


```
function getWay(num) {
	var num = num * 10
	for (var i = 0; i <= num / 50; i++) {

		for (var j = 0; j <= num / 20; j++) {
			if ((num - i * 50) < 0) break
			for (var k = 0; k <= num / 10; k++) {
				if ((num - i * 50 - j * 20 - k * 10) < 0) break

				var m =(num - i * 50 - j * 20 - k * 10)/5
				if (i * 50 + j * 20 + k * 10 + m * 5 == num) {
					console.log('i=>' + i + 'j=>' + j + 'k=>' + k + 'm=>' + m)
				}
				
			}
		}
	}
}
getWay(8)

结果:
i=>0j=>0k=>0m=>16
i=>0j=>0k=>1m=>14
i=>0j=>0k=>2m=>12
i=>0j=>0k=>3m=>10
i=>0j=>0k=>4m=>8
i=>0j=>0k=>5m=>6
i=>0j=>0k=>6m=>4
i=>0j=>0k=>7m=>2
i=>0j=>0k=>8m=>0
i=>0j=>1k=>0m=>12
i=>0j=>1k=>1m=>10
i=>0j=>1k=>2m=>8
i=>0j=>1k=>3m=>6
i=>0j=>1k=>4m=>4
i=>0j=>1k=>5m=>2
i=>0j=>1k=>6m=>0
i=>0j=>2k=>0m=>8
i=>0j=>2k=>1m=>6
i=>0j=>2k=>2m=>4
i=>0j=>2k=>3m=>2
i=>0j=>2k=>4m=>0
i=>0j=>3k=>0m=>4
i=>0j=>3k=>1m=>2
i=>0j=>3k=>2m=>0
i=>0j=>4k=>0m=>0
i=>1j=>0k=>0m=>6
i=>1j=>0k=>1m=>4
i=>1j=>0k=>2m=>2
i=>1j=>0k=>3m=>0
i=>1j=>1k=>0m=>2
i=>1j=>1k=>1m=>0
```


### 假设修正法


```
function getMax(a, b, c) {
	var m = a;

	m= m > b ? m : b
	m =m > c ? m : c
	console.log(m)

}
getMax(56, 23, 90)
```


```
/** 
 * 判断闰年的规则,能被4整除,但是不能被100整除
 * 能被400整除
 * 
 * 
 * 
 * 
 */

function getYear(year) {
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
		return year + '是闰年'
	} else {
		return '不是闰年'
	}
}
console.log(getYear(2000))


//假设修正法

function getYearTwo(year) {
	var flag = false
	if (year % 4 == 0) flag = true
	if (year % 100 == 0) flag = false
	if (year % 400) flag = true
	if (flag) {
		return year + '是闰年'
	} else {
		return '不是闰年'
	}
}
console.log(getYearTwo(1990))
```


#### 常数变异法

先用最笨的方法,写出想要的格式,然后,改写成变量的格式
```
//打印金字塔

function printStar(n) {
	for(i=1;i<=n;i++){
		for(j=1;j<=n-i;j++){
				document.write("&nbsp;");
		}
		for(k=1;k<=2*i-1;k++){
				document.write("*")
		}
		document.write("<br/>")
	}
}
printStar(10)
```