美文网首页
背包问题

背包问题

作者: LxxxR | 来源:发表于2018-08-27 18:12 被阅读0次

1. 01背包

状态说明:背包体积为v,物品个数为n,f[n,v]表示前n件物品加入背包的最大价值。c_i,w_i表示物品i的体积和价值。
对于第i件物品,有两种选择,加入或不加入,状态转移方程为:
f[i,v]=max(f[i-1,v], f[i-1,v-c_i]+w_i)
空间优化:若用二维数组,需要(n+1)*(v+1)的空间,这里采用滚动数组,需要(v+1)的空间。
步骤:
1 初始化数组:
f[v+1]={0,0,0,0,0,...} 不要求装满
f[v+1]={0,-INF,-INF,-INF,...} 要求装满
2 遍历更新

for(i=0;i<n;i++)  //遍历每件物品
  for(j=v;j>=c_i;j--)  //采用滚动数组,所以从后往前赋值;遍历背包的容量,到c_i时就可以,因为再小背包装不下了物品i,f[i,v]=f[i-1,v],不必更新
    f[j]=max(f[j], f[j-c_i]+w_i); //采用滚动数组,所以从后往前赋值

3 返回结果f[v]。有的题目求的是最小价值,max换成min即可。有时题目隐含的给出物品的价值,例如物品的个数作为价值,求个数最小。

2. 完全背包

即每件物品可以选无穷件。01背包只有一件,所以状态转移时为:max(选0件,选1件)。这里状态转移时,需要一个for循环,遍历所有可能的件数,再进行一次状态转移。
时间优化
对背包体积遍历时,从前往后遍历

for(i=0;i<n;i++)  
  for(j=c_i;j<=v;j++)  //从前往后遍历背包体积
    f[j]=max(f[j], f[j-c_i]+w_i); 

例1 零钱兑换

背包体积为总金额,物品为不同面额的硬币,物品价值为硬币个数,求最小价值,完全背包。

    int coinChange(vector<int>& coins, int amount) {
        int len=coins.size();
        if(amount==0 || len==0) return 0;

        int INF=1000000;
        vector<int> dp(amount+1,INF);
        dp[0]=0;

        for(int i=0;i<len;i++){
          for(int j=coins[i];j<=amount;j++){
            dp[j]=min(dp[j],dp[j-coins[i]]+1);
          }
        }

        if(dp[amount]>=INF)
          return -1;
        else
          return dp[amount];
    }

例2 完美平方

背包容量为n,物品为小于n的平方数,数字的个数为价值,求最小,完全背包。

    int numSquares(int n) {
        if(n<=0) return 0;

        const int INF = 1000000;
        vector<int> dp(n+1,INF);
        dp[0]=0;

        int len=sqrt(n);
        vector<int> v; //物品
        for(int i=1;i<=len;i++)
            v.push_back(i*i);

        for(int i=0;i<len;i++){ //遍历len件物品
            for(int j=v[i];j<=n;j++){ //遍历不同体积的背包
                dp[j]=min(dp[j],dp[j-v[i]]+1);
            }
        }

        return dp[n];
    }

相关文章

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 背包问题

    0-1背包问题 问题 n个物体,它们各自有重量和价值,给定一个有容量的背包,如何让背包里装入的物体价值总和最大? ...

  • 背包问题

    问题描述 假如有一个能装下4磅的背包,如何从下列商品列表中选择商品填充背包,使价值达到最大: 动态规划 要解决背包...

  • 背包问题

    (1)0-1背包容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2...

  • 背包问题

  • 背包问题

    01背包(物品只有一个) 有N件物品和一个容量为V的背包。第i建物品的费用是w[i],价值是v[i]。求解将哪些物...

  • 背包问题

    1. 01背包 状态说明:背包体积为v,物品个数为n,f[n,v]表示前n件物品加入背包的最大价值。c_i,w_i...

  • 背包问题

    01背包 优化空间复杂度,变为一维; 外循环依然是n从1->N, 注意内循环 v是从V->0,为什么内循环是V->...

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

网友评论

      本文标题:背包问题

      本文链接:https://www.haomeiwen.com/subject/skytwftx.html