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.

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

  • 相关阅读:
    JS跨域
    Cookie的Domain
    Mvc自定义分页控件
    SQLServer日期函数
    IIS里面网站停止了,不能启动
    JS面向对象
    我已下定决心,回郴州老家发展
    支持向量机
    无监督降维:主成分分析法
    机器学习概念--偏差方差、Pipeline及模型正则
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/5232086.html
Copyright © 2011-2022 走看看