分治,动态规划,贪心算法的区别与理解
区别与理解
参考
蛮有意思的讲解
分治算法代码
package one_day_mt;
import java.util.Scanner;
public class Main {
int[] vs = {0,2,4,3,7};
int[] ws = {0,2,3,5,5};
private int ks(int i,int c) {
int result=0;
if(i==0||c==0) {
return 0;
}else if(ws[i]>c) {
result=ks(i-1,c);
}else {
int temp1=ks(i-1,c);
int temp2=ks(i-1,c-ws[i])+vs[i];
result=Math.max(temp1, temp2);
}
return result;
}
private void test() {
int result;
result=ks(4,10);
System.out.println(result);
}
public static void main(String[] args)
{
Main m=new Main();
m.test();
}
}
动态规划
自上而下填表法
package one_day_mt;
import java.util.Scanner;
public class Main {
int[] vs = {0,2,4,3,7};
int[] ws = {0,2,3,5,5};
Integer [][]results=new Integer[5][11];
private int ks(int i,int c) {
int result=0;
if(results[i][c]!=null) {return results[i][c];}
if(i==0||c==0) {
return 0;
}else if(ws[i]>c) {
result=ks(i-1,c);
}else {
int temp1=ks(i-1,c);
int temp2=ks(i-1,c-ws[i])+vs[i];
result=Math.max(temp1, temp2);
results[i][c] = result;
}
return result;
}
private void test() {
int result;
result=ks(4,10);
System.out.println(result);
}
public static void main(String[] args)
{
Main m=new Main();
m.test();
}
}
自下而上填表法
int[] vs = {0,2,4,3,7};
int[] ws = {0,2,3,5,5};
Integer[][] results = new Integer[5][11];
public void testKnapsack3() {
int result = ks3(4,10);
System.out.println("最大价值为:"+result);
System.out.println("二维数组的值为:");
for(int i=0;i<5;i++) {
for(int j=0;j<11;j++) {
System.out.print(results[i][j]+" ");
}
System.out.println();
}
}
private int ks3(int i, int j){
for (int m = 0; m <= i; m++){
results[m][0] = 0;
}
for (int m = 0; m <= j; m++){
results[0][m] = 0;
}
for (int m = 1; m <= i; m++){
for (int n = 1; n <= j; n++){
if (n < ws[m]){
results[m][n] = results[m-1][n];
} else {
if (results[m-1][n] > results[m-1][n-ws[m]] + vs[m]){
results[m][n] = results[m-1][n];
} else {
results[m][n] = results[m-1][n-ws[m]] + vs[m];
}
}
}
}
return results[i][j];
}
public static void main(String avgs[]) {
Main m=new Main();
m.testKnapsack3();
}
}