原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

【算法】多重背包(有限背包) 动态规划

【题解】http://blog.csdn.net/acdreamers/article/details/8563283

优化:若物品数量(num[i])*物品重量(w[i])>背包容量(m),就相当于无限背包。

对于num[i],可以拆成若干个01背包来实现1...num[i]的全覆盖,二进制原理:

1...k中的数可以由1.2.4...2t.k-2t+1+1(2t+2 > k ≥ 2t+1)组成。

具体实现见代码。

还有一种优先队列优化的有限背包算法,不介绍。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int num[maxn],f[maxn],w[maxn],v[maxn],m,n;
void zeroone_pack(int W,int V)
{
for(int i=m;i>=W;i--)f[i]=max(f[i],f[i-W]+V);
}
void complete_pack(int W,int V)
{
for(int i=W;i<=m;i++)f[i]=max(f[i],f[i-W]+V);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
scanf("%d%d%d",&w[i],&v[i],&num[i]);//w[i]重量 value[i]价值
for(int i=;i<=n;i++)
if(num[i]*w[i]>m)complete_pack(w[i],v[i]);
else
{
int k=;
while(k<num[i])
{
zeroone_pack(w[i]*k,v[i]*k);
num[i]-=k;
k<<=;
}
zeroone_pack(w[i]*num[i],v[i]*num[i]);
}
printf("%d\n",f[m]);
}
return ;
}

【HDU】2191 多重背包问题的更多相关文章

  1. HDU 2191多重背包问题、

    #include<cstdio> #include<cmath> #include<iostream> #include<cstring> +; int ...

  2. HDU 1114 完全背包 HDU 2191 多重背包

    HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...

  3. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  4. hdu 2191 多重背包

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  5. hdu 2191多重背包

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  7. hdu 2191 (多重背包二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 实现代码: #include<bits/stdc++.h> using namespac ...

  8. HDU 1059 多重背包问题

    问题大意: 有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人 #include <cstdio> #include <cstring&g ...

  9. hdu 2191 【背包问题】

    题目 请输出能够购买大米的最多重量,注意是重量不是价值. 把每一种物品拧出来,用01背包解决. #include <cstdio> #include <iostream> #i ...

随机推荐

  1. 第九周(11.11-11.17)----Beta版本视频发布

    beta阶段视频发布地址: http://v.youku.com/v_show/id_XMTgxNjE2NzY3Mg==.html

  2. XLSReadWriteII5使用示例

    之前一直是使用XLSReadWriteII4,今天更新到XLSReadWriteII5,测试了一下,发现一些操作变化比较大,现将XLSReadWriteII5的使用示例写一下,以下是代码和生成的exc ...

  3. Idea安装Python插件并配置Python SDK

    第一步:在help/about中查看IDEA版本,作者IDEA 15.0.2 第二步:在http://plugins.jetbrains.com/plugin/631中下载python-143.116 ...

  4. 用go实现的一个堆得数据结构

    用golang实现的堆,主要提供了两个方法,push和pop及堆的大小,代码如下: package main import ( "errors" "fmt" ) ...

  5. Linux上的free命令详解-收藏

    解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...

  6. H5实现的时钟

    源码如下: <!doctype html> <html> <head></head> <body> <canvas id=" ...

  7. 题解 P2026 【求一次函数解析式】

    高中方式轻松解决这个模拟题. 首先我们了解斜率的简单求法: \[k= {y2-y1 \over x2-x1}{=}{\Delta y \over \Delta x}\] 然后我们了解到让我们求解一次函 ...

  8. Sort HDU - 5884(优先队列+二分)

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. hbase 跳转过滤器skipfilter

    用于跳过整个行键,需要和其他过滤器一起使用,本例SkipFilter和ValueFilter过滤器组合使用过滤不符合条件的行, 如果不配合SkipFiter,ValueFilter只过滤单元值包含的列 ...

  10. MT【143】统一分母

    已知$a,b>0$,则$m=\dfrac{b^2+2}{a+b}+\dfrac{a^2}{ab+1}$的最小值是______ 解答: $$m\geqslant \dfrac{b^2+2}{\sq ...