zoukankan      html  css  js  c++  java
  • 动态规划

    有n种重量和价值分别为wi,vi的物品。从这些物品中挑选总重量不超过W的物品,求出挑选物品价值总和的最大值。每种物品可以挑选任意多件。

    令dp[i+1][j]:=从前i种物品中挑选总重量不超过j时总价值的最大值。那么递推关系为:

    根据递推关系编写代码:

     1 void solve()
     2 {
     3     for (int i = 0; i < n; i++)
     4     {
     5         for (int j = 0; j <= W; j++)
     6         {
     7             for (int k = 0; k * w[i] <= j; k++)
     8             {
     9                 dp[i+1][j] = max(dp[i+1][j], dp[i][j-k*w[i]] + k * v[i]);
    10             }
    11         }
    12     }
    13     cout << dp[n][W] << endl;
    14 }

     关于k的循环最坏可能从0循环到W,所以算法复杂度为O(nW2)。

    在dp[i+1][j]的计算中选择k(k>=1)个的情况,与在dp[i+1][j-w[i]]的计算中选择k-1个的情况是相同的,所以dp[i+1][j]的递推中k>=1的部分计算已经在dp[i+1][j-w[i]]的计算中完成了。那么可以按照如下方式进行:

    这样一来就不需要关于k的循环了,便可以使用O(nW)时间解决问题。

     1 void solve1()
     2 {
     3     for (int i = 0; i < n; i++)
     4     {
     5         for (int j = 0; j <= W; j++)
     6         {
     7             if (j < w[i])
     8             {
     9                 dp[i+1][j] = dp[i][j];
    10             }
    11             else
    12             {
    13                 dp[i+1][j] = max(dp[i][j], dp[i+1][j-w[i]]+v[i]);
    14             }
    15         }
    16     }
    17     cout << dp[n][W] << endl;
    18 }
  • 相关阅读:
    SQL随记(四)
    一些有用的方法命令
    导航目录
    HTML中&nbsp; &ensp; &emsp; &thinsp;等6种空白空格的区别
    MyBatis学习资料
    Spring Cloud资料
    聚类算法对比
    Spark 读取HBase数据
    ZooKeeper设置ACL权限控制
    大数据工具选择
  • 原文地址:https://www.cnblogs.com/bournet/p/4099662.html
Copyright © 2011-2022 走看看