背包问题(dp基础)

  

题目描述:
  在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
Input
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
Output
输出可以容纳的最大价值。
Input示例
3 6
2 5
3 8
4 9
Output示例
14


思路:设bp[i][v]为前i个物品放入到容量为v的背包当中;
    状态转移方程为:
      

for(int i=1;i<=n;i++){
        for(int v=1;v<=w;v++){
            if(v<W[i]) bp[i][v]=bp[i-1][v];
            else bp[i][v]=max(bp[i-1][v],bp[i-1][v-W[i]]+P[i]);
            //cout<<i<<"  "<<v<<"  "<<bp[i][v]<<endl;
        }
    }
优化:使用一位数组进行优化;将算法复杂度优化到O(n);
  for(int i=w;i>=W[i];i--)
    dp[i]=max(dp[i],dp[i-W[i]]+P[i]);

转载于:https://www.cnblogs.com/yoyo-sincerely/p/5152621.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值