AcWing 5 多重背包问题 II

【题目描述】

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

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

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

输出最大价值。

【输入格式】

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

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

【输出格式】

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

【输入样例】

4 5

1 2 3

2 4 1

3 4 3

4 5 2

【输出样例】

10

【数据范围】

0<N≤1000

0<V≤2000

0<vi,wi,si≤200

提示:

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

核心

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int n;
    cin>>n;
    cout<<n<<"=";
 
    int k=1;
    while(k<=n) {
        if(k==n) cout<<k;
        else cout<<k<<"+";
        n=n-k;
        k=k*2;
    }
 
    if(n>0) cout<<n;
 
    return 0;
}
 
/*
in1:26
out1:26=1+2+4+8+11
in2:7
out2:7=1+2+4
*/

代码如下

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
 
const int maxn=2e4+5;
int vol[maxn],val[maxn];
int f[maxn];
int n,v,cnt;
 
int main() {
    cin>>n>>v;
    for(int i=1; i<=n; i++) {
        int volume,value,num;
        cin>>volume>>value>>num;
 
        int k=1;
        while(k<=num) {
            cnt++;
            vol[cnt]=volume*k;
            val[cnt]=value*k;
            num=num-k;
            k=k*2;
        }
 
        if(num>0) {
            cnt++;
            vol[cnt]=volume*num;
            val[cnt]=value*num;
        }
    }
 
    for(int i=1; i<=cnt; i++) {
        for(int j=v; j>=vol[i]; j--) {
            f[j]=max(f[j],f[j-vol[i]]+val[i]);
        }
    }
    cout<<f[v]<<endl;
 
    return 0;
}
 
/*
in:
4 5
1 2 3
2 4 1
3 4 3
4 5 2
out:
10
*/
相关推荐
星光开发者6 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
-森屿安年-6 小时前
按身高排序
c++·算法
程序员清风6 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
无定义_6 小时前
Codeforces Round 1124 (Div. 2)
算法
垆边人似月.8 小时前
任务混部(200 分档)
算法
言乐68 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
如意猴8 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i8 小时前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
朝朝辞暮i10 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J10 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa