暴力递归——从左往右的尝试模型2,背包问题

简介: 暴力递归——从左往右的尝试模型2,背包问题

给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表i号物品的重量和价值。给定一个正数bag,表示一个载重bag的袋子,你装的物品不能超过这个重量。返回你能装下最多的价值是多少?

博主个人认为,从左往右的尝试模型这一类题型的关键点在于讨论当前位置的东西要或者不要,然后再具体分析,详情看代码吧,都写了很详细的注释。

补充一点:方法二是这一类题最常见的暴力解法,跟方法一相比恰好是逆向思维。

package com.harrison.class12;
public class Code06_Knapsack {
  // 不变参数 w[] v[] bag
  // alreadyW 0~index位置的货物已经做过决定了,现在形成的重量
  // 返回index及其往后位置货物的最大价值
  // 返回 -1 认为方案无效,
  // 返回不是-1,返回值就是真实的价值
  public static int process1(int[] w,int[] v,int index,int alreadyW,int bag) {
    if(alreadyW>bag) {// 超过了载重,方案无效
      return -1;
    }
    // 重量没吵 && 没有货物了,所以此时的最大价值就是0
    if(index==w.length) {
      return 0;
    }
    // 没有要当前货物
    int p1=process1(w, v, index+1, alreadyW, bag);
    // 要了当前的货物
    int p2next=process1(w, v, index+1, alreadyW+w[index], bag);
    int p2=-1;
    // 如果要了当前位置的货物 && 重量没有超过bag
    // 那么这种情况下的最大价值就要加上当前这个货物的价值
    if(p2next!=-1) {
      p2=p2next+v[index];
    }
    // 返回要当前货物和不要当前货物两种情况下的最大价值
    return Math.max(p1, p2);
  }
  public static int maxValue1(int[] w,int[] v,int bag) {
    if(w==null || v==null || w.length!=v.length || w.length==0) {
      return 0;
    }
    return process1(w, v, 0, 0, bag);
  }
  // rest 当前剩余的重量,其余参数跟你上面方法一样
  public static int process2(int[] w,int[] v,int index,int rest) {
    // 如果没有剩余重量了,方案无效
    if(rest<0) {
      return -1;
    }
    // 如果有剩余空间但是没有货物了
    // 那么index及其往后位置的货物的最大价值就是0
    if(index==w.length) {
      return 0;
    }
    // 不要当前位置的货物,所以rest没变
    int p1=process2(w, v, index+1, rest);
    // 要了当前位置的货物,所以剩余空间要减去当前货物的重量
    int p2next=process2(w, v, index+1, rest-w[index]);
    int p2=-1;// 要当前位置货物的话,可能会导致方案无效,也就是剩余重量可能会<0
    // 如果要了当前货物 && 还有剩余重量(方案有效)
    if(p2next!=-1) {
      p2=p2next+v[index];
    }
    // 返回要跟不要当前货物两种情况下的最大值
    return Math.max(p1, p2);
  }
  public static int maxValue2(int[] w,int[] v,int bag) {
    if(w==null || v==null || w.length!=v.length || w.length==0) {
      return 0;
    }
    return process2(w, v, 0, bag);
  }
  public static void main(String[] args) {
    int[] w = { 3, 2, 4, 7, 3, 1, 7 };
    int[] v = { 5, 6, 3, 19, 12, 4, 2 };
    int bag=15;
    System.out.println(maxValue1(w, v, bag));
    System.out.println(maxValue2(w, v, bag));
  }
}
相关文章
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
3482 0
|
12月前
|
缓存 安全 网络协议
HTTPS协议的历史发展
HTTPS协议的历史发展
467 8
|
Java 网络安全
zookeeper的环境搭建和配置
本文介绍了如何在多台节点上搭建和配置Zookeeper环境。内容包括Zookeeper的下载、解压、环境变量配置、配置文件修改、zkdata目录创建、myid文件设置,以及将Zookeeper及其配置文件复制到其他节点。还提供了运行测试的命令,包括启动、状态检查和停止Zookeeper服务。
zookeeper的环境搭建和配置
|
机器学习/深度学习 缓存 监控
Redis经典问题:热点key问题
本文介绍了Redis中的热点key问题及其对系统稳定性的影响。作者提出了多种提前发现热点key的方法,包括历史数据分析、业务分析、实时监控、用户行为分析和机器学习预测。同时,文章列举了应对热点key的解决方案,如分布式存储、主从复制、前置缓存、定时刷新、限制逃逸流量和兜底逻辑。通过这些策略,可以有效管理和预防热点key带来的挑战,保证系统性能和可用性。
1746 5
|
缓存 程序员 Shell
php定时任务,php定时器,php定时器,php定时任务管理,php定时任务框架,php实现定时任务,php定时任务系统
php定时任务,php定时器,php定时器,php定时任务管理,php定时任务框架,php实现定时任务,php定时任务系统
429 0
数组连续最大序列问题----【滑动窗口、动态规划求解】
数组连续最大序列问题----【滑动窗口、动态规划求解】
268 0
|
Python 网络架构 C语言
Python程序的执行原理
1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。 2. 字节码 字节码在Python虚拟机程序里对应的是PyCodeObject对象。
1689 0
|
算法
ACM书籍推荐
                                                                      acm算法书籍收藏推荐  我常感叹到,学计算机的人是幸福的,因为在这个领域中有如此多的通俗易懂(相对来说)的经典好书,你需要做的只是坚持把它们一本一本读下去而已。
1419 0
|
2天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。