所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
2. 把求解的问题分成若干个子问题。
3. 对每一子问题求解,得到子问题的局部最优解。
4. 把子问题的解局部最优解合成原来解问题的一个解。
贪心算法适用的前提是:局部最优策略能导致产生全局最优解
实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。
其实该情况是符合贪心策略的,因为该总情况不管先选哪两个都会把背包塞满,因为该题物品可以分割成任意大小,所以,就算空下一下,也可以将最后一个物品分割,放进去,它们的单位重量的价值是一样的,所以,最后背包最后重量相同,重量相同那么价值也相同。)
所以采用第三种策略,代码如下:
package cn.itcast.recursion;
public class SportsSchedule {
public void scheduleTable(int[][] table, int n) {
if (n == 1) {
table[0][0] = 1;
} else {
/* 填充左上区域矩阵
n值的变化:8 4 2 1
m值的变化:4 2 1 1 */
int m = n / 2;
scheduleTable(table, m);
//填充右上区域矩阵
for (int i = 0; i < m; i++) {
for (int j = m; j < n; j++) {
table[i][j] = table[i][j - m] + m;
}
}
//填充左下区域矩阵
for (int i = m; i < n; i++) {
for (int j = 0; j < m; j++) {
table[i][j] = table[i - m][j] + m;
}
}
//填充右下区域矩阵
for (int i = m; i < n; i++) {
for (int j = m; j < n; j++) {
table[i][j] = table[i - m][j - m];
}
}
}
}
public static void main(String[] args) {
int[][] table = new int[8][8];
int n = 8;
SportsSchedule schedule = new SportsSchedule();
schedule.scheduleTable(table, n);
int c = 0;
//打印二维数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(table[i][j] + " ");
c++;//每打印一个数,c++
if (c % n == 0) {//说明打印一行了
System.out.println();//换行
}
}
}
}
}
原文:https://www.cnblogs.com/xiaozhongfeixiang/p/11942890.html