分治法
一、基本概念
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等。
二、基本思想及策略
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法
二分搜索算法
public static int bsearch(int []num,int low,int high,int k){
int mid;
while(low<=high){
mid=(low+high)/2;
if(num[mid]==k){
return mid;
}
else if(num[mid]>k){
high=mid-1;
}
else{
low=mid+1;
}
}
return 0;
}
贪心算法
贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。
贪心算法的基本思路:
1、 建立数学模型来描述问题。
2、 把求解的问题分成若干个子问题。
3、 对每一子问题求解,得到子问题的局部最优解。
4、 把子问题的解局部最优解合成原来解问题的一个解。
贪心算法适用的问题
局部最优策略能够导致全局最优解,也就是算法终止的时候,局部最优等于全局最优。
钱币找零问题
public class 硬币找零 {
public static void main(String[] args) {
int[] value = { 1, 2, 5, 10, 20, 50, 100 };
int[] count = { 3, 0, 2, 1, 0, 3, 5 };
int[] result = new int[value.length];
Scanner input = new Scanner(System.in);
int money = input.nextInt();
solve(money, count, value, result);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]+" ");
}
System.out.println();
}
private static int solve(int money, int[] count, int[] value, int[] result) {
// TODO Auto-generated method stub
int num = 0;
int c = 0;
for (int i = value.length - 1; i >= 0; i--) {
c = Math.min(money /value[i], count[i]);
result[i] = c;
num = num + c;
money = money - value[i] * c;
}
if(money==0){
System.out.println(num);
return num;
}else
return -1;
}
}