HDU 2844 混合背包、
题意:一个人想买手表,给你n个价值的硬币,然后给你n个价值硬币对应的个数、但是呢,这个人只知道这个手表的价格不超过m元、问他最多能买多少种价值的手表
思路:dp背包专题 但是- - 一直不知道该怎么dp 终于想通了、
PS:对于背包dp说一说自己的理解吧(虽然不知道有什么用) 一旦涉及到dp 你就要考虑dp数组里面存的是什么,另外一维数组的话你就要考虑dp[i]中,那个i代表的是什么,同理二维数组也是一样、 然后写出状态转移方程,你的状态转移方程一定要和你dp数组里面存的状态是相一致的、
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int qq=;
int a[qq],c[qq];
int dp[]; //dp[i]代表价值为i能用硬币的最大数量、
int m;
void wanquan(int x,int y)
{
for(int i=x*y;i<=m;++i)
if(dp[i-x])
dp[i]=max(dp[i],dp[i-x]+y);
else if(i-x==)
dp[i]=max(dp[i],dp[i-x]+y);
return;
}
void beibao(int x,int y)
{
int c=x*y;
for(int i=m;i>=c;--i)
if(dp[i-c])
dp[i]=max(dp[i],dp[i-c]+y);
else if(i-c==)
dp[i]=max(dp[i],dp[i-x]+y);
}
void f(int x,int y)
{
if(x*y>=m){
wanquan(x,);
return;
}
int t=;
while(y>=t){
beibao(x,t);
y=y-t;
t=t<<;
}
if(y) beibao(x,y);
}
int main()
{
int n;
while(~scanf("%d%d",&n,&m)&&(n||m)){
memset(dp,,sizeof(dp));
for(int i=;i<n;++i)
scanf("%d",&a[i]);
for(int i=;i<n;++i)
scanf("%d",&c[i]);
int count=;
for(int i=;i<n;++i)
f(a[i],c[i]);
int sum=;
// for(int i=1;i<=m;++i)
// printf("%d ",dp[i]);
for(int i=;i<=m;++i) //dp[i]不为0也就是说能用所拥有的硬币组成价值i
if(dp[i]) ++sum;
printf("%d\n",sum);
}
return ;
}
去杭州前把这道题A了 没来得及记录下、 今天补上
HDU 2844 混合背包、的更多相关文章
- hdu 2844 混合背包【背包dp】
http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张.问这些钱能拼成 ...
- hdu 2844 多重背包coins
http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意: 有n个硬币,知道其价值A1.....An.数量C1...Cn.问在1到m价值之间,最多能组成多少种 ...
- Coins(hdu 2844 多重背包)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 2844 多重背包的转化问题 以及这个dp状态的确定
在杭电上测试了下 这里的状态转移方程有两个.,. 现在有价值val[1],val[2],…val[n]的n种硬币, 它们的数量分别为num[i]个. 然后给你一个m, 问你区间[1,m]内的所有数目, ...
- hdu 2844 多重背包+单调队列优化
思路:把价值看做体积,而价值的大小还是其本身,那么只需判断1-m中的每个状态最大是否为自己,是就+1: #include<iostream> #include<algorithm&g ...
- hdu 2844 多重背包二进制优化
//http://www.cnblogs.com/devil-91/archive/2012/05/16/2502710.html #include<stdio.h> #define N ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- Coins(HDU 2844):一个会超时的多重背包
Coins HDU 2844 不能用最基础的多重背包模板:会超时的!!! 之后看了二进制优化了的多重背包. 就是把多重转变成01背包: 具体思路见:http://www.cnblogs.com/tt ...
- HDU 3535 AreYouBusy(混合背包)
HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...
随机推荐
- Win7系统中wmiprvse.exe占用CPU高如何解决
该进程的详细路径是在:C:\WINDOWS\System32\Wbem 我们可以在任务管理器中“wmiprvse.exe”进程上单击右键,选择“打开文件位置”即可看到,如果该文件不在该文件夹中,那么 ...
- Poj 1182种类(带权)并查集
题目链接 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44316 Accepted: 12934 Descriptio ...
- 三分钟学会在ASP.NET Core MVC 中使用Cookie
一.Cookie是什么? 我的朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!所以我们 ...
- MySQL.之 一行内容转换多行
MySQL.之 一行内容转换多行 描述: 将一行记录中的某一列值(值格式:数据之间用英文逗号隔开),将这一数据转换成多行. 例如:表 cds_var 中的 cds_value 中的数据格式:多个id之 ...
- Quarz框架学习
参考博客:https://www.cnblogs.com/zhanghaoliang/p/7886110.html
- HTML5小知识汇总
1.关于<!DOCTYPE HTML> H5只需要<!DOCTYPE HTML>这样简单的声明,不用之前一长串代码,因为H5不是基于SGML,所以不需要对DTD引用,但是需要D ...
- AS2.2使用CMake方式进行JNI/NDK开发
之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术. 这篇文章给大家介绍下JNI/NDK开发.采用的是Android Studio2.2开发环境, ...
- Android Bitmap缓存介绍
转载自http://blog.csdn.net/linghu_java/article/details/8595717 Android中加载一个Bitmap(位图)到你的UI界面是非常简单的,但是如果 ...
- jdbc框架-dbutils的简单使用
jdbc框架-dbutils的简单使用 dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用 使用步骤: 1.导入jar包(commons-dbutils-1.4.jar) ...
- Leetcode806.Number of Lines To Write String写字符串需要的行数
我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行.我们给定了一个数组 width ...