0/1背包

0/1背包

0/1背包输出具体方案

思路:定义标记数组,从 d p dp dp终点开始步步向上回溯,根据0/1背包状态转移方程式 p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − c [ i ] ] + w [ i ] ) p[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]) p[i][j]=max(dp[i1][j],dp[i1][jc[i]]+w[i])可知,判断 d p [ i ] [ j ] dp[i][j] dp[i][j] d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j] d p [ i − 1 ] [ j − c [ i ] ] + w [ i ] dp[i-1][j-c[i]]+w[i] dp[i1][jc[i]]+w[i]关系即可判断第 i i i个物品是否已装,最后输出标记数组。

注:求解具体方案仅适用于非滚动数组,因为滚动过程会将中间状态信息丢失。

extern int dp[MAX][MAX],i,j;//i,j:dp终点
bool f[MAX];
void print(){
    for(;i>=1;i--){
        if(j>=c[i]&&dp[i][j]==dp[i-1][j-c[i]+w[i]]){//说明第i个物品已选
            f[i]=1;
            j-=c[i];
        }
    }
    for(int k=1;k<=n;k++) if(f[k]) cout<<k<<' ';
}

相关推荐

  1. 01-背包

    2024-07-14 01:22:04       33 阅读
  2. 01背包与完全背包

    2024-07-14 01:22:04       40 阅读
  3. 01背包问题dp

    2024-07-14 01:22:04       38 阅读
  4. 01背包问题

    2024-07-14 01:22:04       36 阅读
  5. 01背包dp问题

    2024-07-14 01:22:04       32 阅读
  6. 01 背包问题(c++)

    2024-07-14 01:22:04       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 01:22:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 01:22:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 01:22:04       57 阅读
  4. Python语言-面向对象

    2024-07-14 01:22:04       68 阅读

热门阅读

  1. python的readline()和readlines()

    2024-07-14 01:22:04       21 阅读
  2. 【date】

    2024-07-14 01:22:04       17 阅读
  3. Reinforement Learning学习记录(五)

    2024-07-14 01:22:04       17 阅读
  4. Docker 部署 Nginx 并在容器内配置申请免费 SSL 证书

    2024-07-14 01:22:04       22 阅读
  5. 牛客小白月赛98---切割 01 串 2.0

    2024-07-14 01:22:04       19 阅读
  6. 什么是计算机数据结构的字典

    2024-07-14 01:22:04       22 阅读
  7. 7.13扣...

    2024-07-14 01:22:04       21 阅读