【HDU】2191 多重背包问题
原题目:悼念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 多重背包问题的更多相关文章
- HDU 2191多重背包问题、
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> +; int ...
- HDU 1114 完全背包 HDU 2191 多重背包
HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...
- hdu 2191 (多重背包+二进制优化)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- hdu 2191 多重背包
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- hdu 2191多重背包
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- hdu 2191 (多重背包二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 实现代码: #include<bits/stdc++.h> using namespac ...
- HDU 1059 多重背包问题
问题大意: 有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人 #include <cstdio> #include <cstring&g ...
- hdu 2191 【背包问题】
题目 请输出能够购买大米的最多重量,注意是重量不是价值. 把每一种物品拧出来,用01背包解决. #include <cstdio> #include <iostream> #i ...
随机推荐
- js 时间处理函数 获取今天的前几天和后几天的任意一天
var now = new Date(); let today = now.getFullYear() + '-' + (now.getMonth() + 1) + '-' + now.getDa ...
- uva 1513(线段树)
题目链接:1513 - Movie collection 题意:有一堆电影,按1-n顺序排,有m次操作,每次询问第ai个电影之前有多少个电影,然后将其抽出放在堆顶. 分析:线段树应用. 因为每次查询后 ...
- leetcode动态规划
http://blog.csdn.net/u012162613/article/details/41428119
- get mobile http request in PC & fiddler4
get mobile http request in PC 如何在 pc 上抓取 手机的 http 请求 Fiddler 提琴手 https://www.telerik.com/download/fi ...
- HDU3829_Cat VS Dog
题目是这样的,给定一些人喜欢某只猫或者狗,讨厌某只猫或者狗.求最多能够同时满足多少人的愿望? 题目很有意思.建模后就很简单了. 对于同一只猫或者狗,如果有一个讨厌,另一个人喜欢,那么这两个连一条边.最 ...
- JS中JSON对象和JSON字符串的相互转化
转:http://www.cnblogs.com/wbyp/p/7086318.html 一.JSON字符串转换为JSON对象 var str = '{"name":"c ...
- P3216 [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- java实现函数指针
在Java程序员面试笔试宝典中看到的东西,感觉很有用,特开此文 函数指针一般作为函数的参数来使用,开发人员在使用是可以根据自己的需求传递自动以的函数来实现指定的功能,例如,在实现排序算法时,可以通过传 ...
- 【刷题】洛谷 P1519 穿越栅栏 Overfencing
题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...
- BZOJ3635谈笑风生
一些闲话 这题方法好多啊QAQ,离线有BIT.长链剖分,在线有线段树合并,主席树等. 要我出题绝对不可能放离线过... 题面链接 权限题诶 洛谷 题意简述 简单的看一下题意,就是给定\(a\),求任何 ...