首页 > 其他 > 详细

多重背包二进制优化

时间:2021-05-17 21:54:53      阅读:16      评论:0      收藏:0      [点我收藏+]

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N≤10000
0<V≤20000
0<vi,wi,si≤20000

提示:

本题考查多重背包的二进制优化方法。

输入样例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:

10

假如有14件体积为v,价值为w的某物品,我们可以将它们分组打包成4组, 每组分别有1,2,4,6件,将这每组物品看成不可分割的一个物品,这四组的选与不选的组合可以表示选0 ~ 14个任意一种情况

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 2010;
int dp[N];

int main() {
    int n, t;
    cin >> n >> t;
    while(n--) {
        int v, w, s;
        cin >> v >> w >> s;
        int cnt = 1;
        while(cnt < s) {
            for(int i = t; i >= cnt * v; i--) {
                dp[i] = max(dp[i], dp[i - cnt * v] + cnt * w);
            }
            s -= cnt;
            cnt *= 2;
        }
        if(s) {
            for(int i = t; i >= s * v; i--) {
                dp[i] = max(dp[i], dp[i - s * v] + s * w);
            }
        }
    }
    cout << dp[t];
    return 0;
}

原题链接

多重背包二进制优化

原文:https://www.cnblogs.com/bleso/p/14778467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!