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
*/
相关推荐
YH55269843 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务4 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶4 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆5 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索6 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
北风toto8 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)8 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码流怪侠8 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm8 小时前
30 两两交换链表中的节点
数据结构·算法·链表
Nil2088 小时前
leetcode 98验证二叉搜索树
算法·leetcode·职场和发展