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
*/
相关推荐
罗超驿2 分钟前
11.LeetCode 1004. 最大连续1的个数 III | 滑动窗口解法详解(Java)
java·算法·leetcode
QiLinkOS6 分钟前
发明人与专利价值共生逻辑
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
计算机安禾17 分钟前
【算法分析与设计】第21篇:回溯法的状态空间树与剪枝函数设计
大数据·人工智能·算法·机器学习·数据挖掘·剪枝
磊 子19 分钟前
STL之set以及set和map区别
开发语言·c++·算法
Promise微笑28 分钟前
算法突围:“双核四驱”理论下的“官网”AI引用概率提升指南
人工智能·算法·chatgpt
KaMeidebaby34 分钟前
卡梅德生物技术快报|免疫共沉淀 - Co-IP 实验在转录因子 ATF3/Smad4 蛋白互作研究中的应用实例解析
网络·人工智能·网络协议·tcp/ip·其他·算法·新浪微博
wayz1139 分钟前
20260530 软件ETF(159852)量化分析
算法·金融·数据分析·量化交易
通信小呆呆1 小时前
Hankel结构及其快速算法详解
线性代数·算法·机器学习
四代水门1 小时前
服务端倒带(Server-Side Rewind)命中判定系统
java·前端·算法
吃好睡好便好1 小时前
矩阵的左除和右除
人工智能·学习·线性代数·算法·矩阵