c++0-1背包问题:

每次刷动态规划的题,第一个就是想起来它,在这里简记一下。

有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

1.状态变量:f[i][j]表示i件物品放入容量为j的背包的最大价值(注意,不是背包剩余容量为j,也不是已经放入的容量为j,而是假设目前背包的总容量为j)

2.当背包容量等j的时候我们要考虑第i件物品能否放入?是否放入?

3.如果j<w[i]的时候表示背包容量不够,这个时候背包最大价值应该等于容量等于j的时候i-1件物品的最大价值f[i][j]=f[i-1][j]

4.当背包容量j>=w[i]的时候,分为两种情况 (1)不放 当第i件物品不放入的时候f[i][j]=f[i-1][j] (2)放入 当第i件物品放入背包的时候,f[i][j]=f[i-1][j-w[i]]+v[i],第i件物品让如则需要j-w[i]的容量,这个时候我们应该找第i件物品容量等于j-w[i]最大价值加上当前物品的价值 最后我们需要选取两种选择的最大值f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])

int f[100][100];
int v[100];
int w[100];

int fun(int n,int m){
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(j<w[i]){
                f[i][j] = f[i-1][j];
            }
            else{
                f[i][j] = max(f[i-1][j], f[i-1][j-w[i]]+v[i]);
            }
        }
    }
    return f[n][m]
}

 

参考链接【0-1背包问题 】详细解析+图解+详细代码_灰太狼!!!的博客-CSDN博客_0-1背包问题

上面就是摘抄的上面这个博主的文章,因为读起来很简单易懂,推荐!

posted @ 2022-04-06 11:40  清心lh  阅读(104)  评论(0编辑  收藏  举报