3269 混合背包

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 钻石 Diamond
 查看运行结果
 
 
题目描述 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 ;
}

最新文章

  1. Leetcode Divide Two Integers
  2. Dojo框架学习笔记&lt;二&gt;
  3. 在网页中显示CHM (c# csharp .net asp.net winform)
  4. less2
  5. EditPlus自动补全、模板配置
  6. dotpeek的导出
  7. c编译器字节对齐指令
  8. jenkins 构建完毕后接着构建另外一个构建的方法
  9. linux系统原子操作
  10. Mysql相关技术细节整理
  11. day27(反射之内省机制实现BeanUtils)
  12. Netty 聊天小程序
  13. vue.js中请求数据v-for循环使用数据
  14. Service和Thread的关系
  15. PAT (Basic Level) Practice 1032 挖掘机技术哪家强
  16. 重复代码Duplicated Code---要重构的信号
  17. 转载 基于NicheStack协议栈的TCP/IP实现
  18. Business Component(BC)和Business Object(BO)
  19. owasp zap 安全审计工具 功能详解
  20. NIO之管道 (Pipe)

热门文章

  1. Resource 使用详解
  2. 按需制作最小的本地yum源
  3. C程序设计(第四版)课后习题完整版 谭浩强编著
  4. Spring的数据库编程浅入浅出——不吹牛逼不装逼
  5. Guava cache使用总结
  6. UML类图(1.3)
  7. zuul 路由网关 微服务架构系统中
  8. 《白帽子讲web安全》——吴瀚清 阅读笔记
  9. Jmeter接口自动化实例(使用Beanshell保存csv文件、csv参数化、setUp线程组)
  10. java表达式