CODE[VS] 3269 混合背包
2024-09-01 06:09:44
题目描述 Description
背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?
输入描述 Input Description
第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限
输出描述 Output Description
1个数Ans表示所装物品价值的最大值
样例输入 Sample Input
2 10
3 7 2
2 4 -1
样例输出 Sample Output
22
数据范围及提示 Data Size & Hint
对于100%的数据,V <= 200000 , N <= 200
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 205
int d[maxn],v[maxn],bag[maxn],f[];
int max(int a,int b)
{
if(a>=b)
return a;
else return b;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(f,,sizeof(f));
for(int i=; i<n; i++)
scanf("%d%d%d",&v[i],&d[i],&bag[i]);
for(int i=; i<n; i++)
{
if(bag[i]==-)
for(int j=v[i]; j<=m; j++)
f[j] = max(f[j],f[j-v[i]]+d[i]);
else
{
int x = bag[i];
for(int k=;k<=x;k<<=)
{//i<<=n 等价于 i=i*(2的n次方); i>>=n 等价于 i=i/(2的n次方)(n>=0)(暂不考虑溢出的情况)
for(int j=m;j>=v[i]*k;j--)
f[j] = max(f[j],f[j-v[i]*k]+d[i]*k);
x -= k;
}
if(x!=)
{
for(int j=m;j>=v[i]*x;j--)
{
f[j] = max(f[j],f[j-v[i]*x]+d[i]*x);
}
}
}
}
cout << f[m];
return ;
}
最新文章
- Leetcode Divide Two Integers
- Dojo框架学习笔记<;二>;
- 在网页中显示CHM (c# csharp .net asp.net winform)
- less2
- EditPlus自动补全、模板配置
- dotpeek的导出
- c编译器字节对齐指令
- jenkins 构建完毕后接着构建另外一个构建的方法
- linux系统原子操作
- Mysql相关技术细节整理
- day27(反射之内省机制实现BeanUtils)
- Netty 聊天小程序
- vue.js中请求数据v-for循环使用数据
- Service和Thread的关系
- PAT (Basic Level) Practice 1032 挖掘机技术哪家强
- 重复代码Duplicated Code---要重构的信号
- 转载 基于NicheStack协议栈的TCP/IP实现
- Business Component(BC)和Business Object(BO)
- owasp zap 安全审计工具 功能详解
- NIO之管道 (Pipe)