关键点:
1 本质是一个二叉树,选不选这个物品
2 设置结束条件,当选择到了最后一个物品
3 理解递归,**我们可以画一个树,是先执行到底,按照一条路径。然后网上捣一层,再往下计算。
这个就是任意两层的关系。**关系有了。还需要我们记录中间的结果,就是我们选不选某个物品,我们就用hashmap 就可以,key 表示物品的编号,value 表示选1 不选0.。在return 结束的时候打印,就好了
4 这个同样可以解决子串问题,全排列问题。还有一种8皇后问题也是类似的会在下面文章写下。
package 算法;
import com.google.gson.internal.LinkedTreeMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class 背包01 {
//有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
// 容量w w1 w2 w3 w4 ..
static int w[]={2,3,5,4,7};
// 价值v v1 v2 v3 v4 ...
static int v[]={1,3,4,2,8};
static int wt= 13;
static int n=5;
static List<Integer> records=new ArrayList<>();
static Map<Integer,Integer> reds=new LinkedTreeMap<>();
static void f(int i,int nowv){ // nowv 在放第i个物品之前的重量
if(i>=n){
System.out.println(nowv);
System.out.println(reds);
return ;
}
reds.put(i,0);
f(i+1,nowv); //先 不选
reds.put(i,1);
if(wt>nowv+w[i]){
f(i+1,nowv+w[i]);
}
}
public static void main(String[] args) {
//f(0,1)
f(0,0);
}
}