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汶川大地震遇难同胞——珍惜现在,感恩生活 ...
随机推荐
- [ 总结 ] nginx 安装过程
本次安装使用源码编译安装: 在安装nginx之前需要先安装三个源码包:pcre.zilb.openssl pcre:用于rewrite重写 zlib: 用于gzip压缩 openss ...
- 【 总结 】linux中test命令详解
test命令在bash shell脚本中经常以中括号([])的形式出现,而且在脚本中使用字母来表示比符号表示更专业,出错率更低. 测试标志 代表意义 文件名.文件类型 -e 该文件名是否存在 -f 该 ...
- SSH的简单入门体验(Struts2.1+Spring3.1+Hibernate4.1)- 查询系统(上)
所谓SSH,指的是struts+spring+hibernate的一个集成框架,它是目前较流行的一种Web应用程序的开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域 ...
- AJAX--前后台交互
注:ajax通过async参数决定是异步还是同步,false同步,true异步; 异步执行顺序是先执行后续动作,再执行success里代码; 同步是先执行success里代码,再执行后续代码; 验证: ...
- 【C++】各种成员变量
来自:黄邦勇帅 const 常量对象: 即把对象声明为常量,即 const hyong m,常量对象不能调用可能改变对象的值的函数,因此常量对象只能调用类中的 const 常量函数,因为不是 cons ...
- Ansi,UTF8,Unicode,ASCII编码的区别 ---我看完了 明白了很多
来自:http://blog.csdn.net/xiongxiao/article/details/3741731 ------------------------------------------ ...
- 高速备份还原MYSQL数据库
#安装依赖包yum -y update gccyum -y install gcc+ gcc-c++ #安装cd /usr/local/softwaretar -jxvf p7zip_16.02_sr ...
- jquery事件之select选中事件
根据select下拉列表选中的不同选项执行不同的方法,工作中经常会用到,这里就要用到Jquery的select选中事件 这里给select加一个叫label_id的id,然后通过id选择器找到这个节点 ...
- *****git pull总结
当git clone之后,直接git pull它会自动匹配一个正确的remote url 是因为在config文件中配置了以下内容: 1 [branch "master"] 2 r ...
- js处理富文本编辑器转义、去除转义、去除HTML标签
富文本编辑器生成的HTML标签,进行转义,然后写入数据库,防止脚本注入: function htmlEncode(value){ return $('<div/>').text(value ...