AC_5. 多重背包问题 II

Posted gcter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC_5. 多重背包问题 II相关的知识,希望对你有一定的参考价值。

技术图片

代码:

//多重背包优化(二进制)
/*
1.怎么把多重背包问题转换为01背包问题
v,w拆开重复s份放到数组里面去,每个物品只能用一次

=> 二进制拆法
7  7以内选多少个数可以使得7中所有的数都可以组合出来  0-7
1 1 1 1 1 1 1

1 2 4
0
1
2
3 =  1 + 2
4 = 4
5 = 1 + 4
6 = 2 + 4
7 = 1 + 2 + 4

给定一个数s,用多少个数可以表示小于等于s的所有数  答案 log2(s)上取整
s = 10
1 2 4 3
1 2 7 :0-7
3: 0-10

s - 1 - 2 - 4 - 8  分成了log(s)份
1000*log(2000)*2000 = 1000*11*2000 = 2 * 10^7
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int NUM = 2010;
int N, V;
int dp[NUM];
//定义结构体 v体积,w表示价格
struct Good
    int v, w;
;
int main()

    vector<Good>goods;//不知道总共的物品有多少个
    cin >> N >> V;
    for (int i = 0; i < N; i++)
    
        int v, w, n;
        cin >> v >> w >> n;
        for (int k = 1; k <= n; k *= 2)//拆成2的整次幂
        
            n -= k;
            goods.push_back( v*k, w*k );//放到物品组中去
        
        if (n>0)
            goods.push_back( v*n, w*n );//剩余的
    
    // 01背包求最大价值
    for (auto good:goods)
        for (int j = V; j >= good.v; j--)
        
            dp[j] = max(dp[j], dp[j - good.v] + good.w);
        
    cout << dp[V] << endl;
    return 0;

 

以上是关于AC_5. 多重背包问题 II的主要内容,如果未能解决你的问题,请参考以下文章

AC_4. 多重背包问题 I

AcWing 5. 多重背包问题 II(二进制优化)

动态规划_01背包_完全背包_多重背包_分组背包

DZY Loves Math II:多重背包dp+组合数

[Mdfs] lc90. 子集 II(组合类型枚举+多重背包+去重经典)

多重背包优化