0
点赞
收藏
分享

微信扫一扫

完全背包理论基础

E_topia 2022-02-19 阅读 46

完全背包:有N个物品和一个最多背重量为W的背包,每个物品的重量为weight[i],价值为value[i],每件物品都有无限个,求解将这些物品放入背包的最大价值总和。

01背包和完全背包的区别体现在遍历顺序上:

for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

01背包的内层是从大到小进行遍历,保证每个物品仅被添加一次,而完全背包是从小到大遍历,物品可添加多次。遍历代码如下:

for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = weight[i]; j <= bagWeight; j++) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

完整C++测试代码:

// 先遍历物品,在遍历背包
void test_CompletePack() {
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    int bagWeight = 4;
    vector<int> dp(bagWeight + 1, 0);
    for(int i = 0; i < weight.size(); i++) { // 遍历物品
        for(int j = weight[i]; j <= bagWeight; j++) { // 遍历背包容量
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
        }
    }
    cout << dp[bagWeight] << endl;
}
int main() {
    test_CompletePack();
}
举报

相关推荐

0 条评论