HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)
HDU 2191悼念512汶川大地震遇难同胞——珍惜如今。感恩生活(多重背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2191
题意:
如果你有资金n元, 然后有m种大米, 每种大米价格为cost[i], 重量为val[i], 数量为num[i]. 如今问你用n元钱最多能买多重的大米?
分析:
本题是典型的多重背包问题.
我们令dp[i][j]==x表示仅仅购买前i种大米,
且总费用<=j时能购买的大米最大重量为x.
初始化: dp为全0.
因为每种大米有数量num[i], 所以我们分以下两种情况做:
当cost[i]*num[i]>=n时, 我们直接对该种大米做一次全然背包过程就可以.
当 cost[i]*num[i]<n
时, 我们把num[i]个第i类大米看成以下k+1种物品:
1个(i类物品) 2个 4个 2^(k-1)个 以及 num[i]-2^k+1个
我们对上述k+1种新物品每一个都做一个01背包就可以覆盖我们可能对第i种物品做出的全部选择.
终于所求: dp[m][n]的值.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=4000+5; int n;//金额
int m;//大米种类
int cost[100+5];//价格
int val[100+5]; //重量
int num[100+5]; //数量
int dp[maxn]; //一次01背包
void ZERO_ONE_PACK(int cost,int val)
{
for(int i=n;i>=cost;i--)
dp[i] = max(dp[i], dp[i-cost]+val);
} //一次全然背包
void COMPLETE_PACK(int cost,int val)
{
for(int i=cost;i<=n;i++)
dp[i] = max(dp[i], dp[i-cost]+val);
} //一次多重背包
void MULTIPLE_PACK(int cost,int val,int num)
{
if(cost*num>=n)
{
COMPLETE_PACK(cost,val);
return;
} int k=1;
while(k<num)
{
ZERO_ONE_PACK(k*cost,k*val);
num -=k;
k*=2;
}
ZERO_ONE_PACK(num*cost,num*val);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
//读取输入
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&cost[i],&val[i],&num[i]); //初始化+递推
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
MULTIPLE_PACK(cost[i],val[i],num[i]); //输出结果
printf("%d\n",dp[n]);
}
return 0;
}
HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)的更多相关文章
- hdu 2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...
- HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...
- --hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
解题思路: 多重背包:第 i 件物品有 j 个可用. 本题中 第 p[i] 类大米 有 c[i] 袋大米可买 ,故本题为多重背包. n(总钱数).m(种类) p[i] 单价 h[i] 重量 c[i] ...
- 多重背包之 HDU -1171Big Event in HDU &HDU -2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
这两道题都是多重背包的基础题,前面的安格题意是:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B,就类似于NYOJ上的那个邮票分你一半那个意思,只不过这里不是一个而 ...
- hdu 2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
#include<iostream> #include<cstdio> #include<algorithm> /* 虽然该题不排序也可以过,但是我认为价格和重量最 ...
- 【多重背包】HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) ...
- 题解报告:hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- HDU2191_悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(背包/多重背包)
解题报告 题目传送门 题意: 中文不多说; 思路: 基础多重背包,每一个物品有多个能够选.转换成01背包解. #include <iostream> #include <cstrin ...
- hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)
题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 ...
随机推荐
- window10下部署flask系统(apache和wsgi)
公司有一个小系统,通过url和其他系统进行数据交互(有点土). 因此,利用flask写了一个小程序. 现在,考虑到并发问题(flask自身是不会并发的),准备部署在apache+wsgi环境. 网上百 ...
- IE8的 JS 引擎如此不堪(二) - 解决方案
上一篇,IE8的JS引擎内存不停增长,是因为动态生成了一个image对象导致的.有了病因,就开始寻找治疗方法. 1.使用一个固定的img对象,但是无法获取地址改变后的图片大小,最总还是放弃: 2.寻找 ...
- 让IE6/IE7/IE8支持CSS3属性的8种方法介绍
我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的 ...
- HDFS API 学习:几个常用的API
1.Hadoop-1.2.1 API 文档:http://hadoop.apache.org/docs/r1.2.1/api/ 2.几个API: create(Path f) :Opens an FS ...
- 显示(explicit )与隐式(implicit)转换操作符
class Program { static void Main(string[] args) { /* * 不管是显示还是隐式转换,一种类型都只能出现一次 */ Console.WriteLine( ...
- LoadRunner系列之---web_set_sockets_options,解决No buffer space available错误
1. 如果在系统运行过程中出现"No buffer space available"或者出现大量连接出现wait的时候, 如何解决? 解决办法: 保证迭代结束后关闭所有的链接: 在 ...
- 【kmp算法】hdu4763 Theme Section
kmp中next数组的含义是:next[i]表示对于s[0]~s[i-1]这个前缀而言,最大相等的前后缀的长度是多少.规定next[0]=-1. 迭代for(int i=next[i];i!=-1;i ...
- dubbo安装(转载)
1. 概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...
- golang的reflect
引用自 http://www.jb51.net/article/115002.htm 和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的.反射操作所需要 ...
- Android 架构 4.总结
以下是Keegan小钢大神原创博客: Android项目重构之路:架构篇Android项目重构之路:界面篇Android项目重构之路:实现篇 看了这几篇文章,以及下面的评论,总结一下,以便以后拓展: ...