zoukankan      html  css  js  c++  java
  • 背包问题(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]);
  • 相关阅读:
    第一次软件作业
    第四次作业之单元测试
    第四次作业之代码规范
    第四次作业之psp
    第四次作业之四则运算
    第三周作业之功能测试
    第三周作业之效能分析
    第三周作业之例行报告
    第二周例行报告(王伟东)
    软件工程第二次作业(王伟东)
  • 原文地址:https://www.cnblogs.com/yoyo-sincerely/p/5152621.html
Copyright © 2011-2022 走看看