01背包问题-回溯法

关键点:
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);

    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京下雨天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值