动态规划之0-1背包问题

本文探讨了背包问题的两种解决方案:记忆化搜索的题解一和动态规划的优化,包括经典DP、滚动数组优化,以及不同类型的背包问题如多重、完全和多维费用问题。通过实例演示了如何利用这些方法求解背包问题,对比了它们的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成


题目

DQ3MTU0,size_16,color_FFFFFF,t_70#pic_center)

题解一 记忆化搜索

F(n,C)考虑将n个物品放进容量为C的背包使得价值最大
F(i,c)=F(i-1,c) //不需要将第i个物品放进背包
=v(i)+F(i-1,c-w(i)) //需要将第i个物品放进背包
F(i,c)=max(F(i-1,c)),v(i)+F(i-1,c-w(i))

/// 背包问题
/// 记忆化搜索
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
/// 空间复杂度: O(n * C)
public class Solution1 {
   
    private int[][] memo;
          //w重量,v价值,c背包容积
    public int knapsack01(int[] w, int[] v, int C){
   
    
        if(w == null || v == null || w.length != v.length)
            throw new IllegalArgumentException("Invalid w or v");
        if(C < 0)
           throw new IllegalArgumentException
           ("C must be greater or equal to zero.");
       
        int n = w.length;
        if(n == 0 || C == 0)
            return 0;
       
        memo = new int[n][C + 1];
        return bestValue(w, v, n - 1, C);
    }

    // 用 [0...index]的物品,填充容积为c的背包的最大价值
    private int bestValue(int[] w, int[] v, int index, int c){
   
        if(c <= 0 || index < 0)
            return 0;

      //重叠子问题用记忆化搜索
        if(memo[index][c] != -1)
            return memo[index][c];
       
       //不放第index个物品
        int res = bestValue(w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值