zoukankan      html  css  js  c++  java
  • 背包问题 (DP)

    利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值.

    递推式:

    dp[i][j]=0     (j<w[i])

                  dp[i][j]

    dp[i][j]=

                  max(dp[i+1][j],dp[i+1][j-w[i]]+v[i])  

    反向:

     1 int dp[MAX][MAX];   //DP数组
     2 
     3 void solve()
     4 {
     5     for(int i=n-1; i>=0; i--){
     6         for(int j=0; j<=W; j++){
     7             if(j<w[i]){
     8                 dp[i][j]=dp[i+1][j];
     9             }
    10             else{
    11                 dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
    12             }
    13         }
    14     }
    15     printf("%d
    ",dp[0][w]);
    16 }

    正向:

     1 int dp[MAX][MAX];   //DP数组
     2 
     3 void solve()   //正向循环
     4 {
     5     for(int i=0; i<=n; i++){
     6         for(int j=0; j<=W; j++){
     7             if(j<w[i]){
     8                 dp[i+1][j]=dp[i+1][j];
     9             }
    10             else{
    11                 dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
    12             }
    13         }
    14     }
    15     printf("%d
    ",dp[n][w]);
    16 }

     另一种:

     1 int dp[MAX][MAX];   //DP数组
     2 
     3 void solve()   //正向循环
     4 {
     5     for(int i=0; i<=n; i++){
     6         for(int j=0; j<=W; j++){
     7             dp[i][j]=max(dp[i+1][j],dp[i][j]);
     8             if(j+w[i]<=W){
     9                 dp[i+1][j+w[i]]=max(dp[i+1][j+w[i]],dp[i][j]+v[i]);
    10             }    
    11         }
    12     }
    13     printf("%d
    ",dp[n][w]);
    14 }

    以这种方式一步步按顺序求出问题的解的方法被称为动态规划,也就是常说的DP.

    <<挑战程序设计竞赛>>读后感

  • 相关阅读:
    Java WebSocket通信Demo
    JAVA FTP/SFTP 上传下载文件
    SpringMVC+MyBatis 事务中 基于注解的声明式事务
    Java 调用支付宝接口
    linux安装Tomcat
    使用cxf发布restful的webservice
    restful的webservice
    oracle时间比较和分页查询
    jenkins问题
    linux安装jenkins
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/5232086.html
Copyright © 2011-2022 走看看