http://acm.hdu.edu.cn/showproblem.php?pid=2844

题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张。问这些钱能拼成1-m中多少种值。

题解:背包dp问题。若ci=1,是01背包,若ci*ai>=m则是完全背包,否则是多重背包。(详见《背包九讲》)

先复习一下三种简单背包形式:

 01背包(F[v] ← max{F[v], F[v −Ci] +Wi} ):

 

  

 完全背包(F[i, v] = max(F[i − 1, v], F[i, v −Ci] +Wi)):

  

 多重背包(利用二进制思想转化为01背包):

  

利用三种背包形式就可以轻松解决此题:

  

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std; int f[];
int c[],a[];
int n,m; void ZeroOnePack(int w,int v)
{
for(int j=m;j>=v;j--)
f[j]=max(f[j],f[j-w]+v);
} void CompletePack(int w,int v)
{
for(int j=v;j<=m;j++)
f[j]=max(f[j],f[j-w]+v);
} void MultiplePack(int w,int v,int c)
{
int k=;
while(k<c)
{
ZeroOnePack(k*w,k*v);
c=c-k;k*=;
}
ZeroOnePack(c*w,c*v);
} int main()
{
while(scanf("%d%d",&n,&m)==)
{
memset(f,,sizeof(f));
if(n==) break;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&c[i]);
for(int i=;i<=n;i++){
if(c[i]==)
ZeroOnePack(a[i],a[i]);
else if(c[i]*a[i]>=m)
CompletePack(a[i],a[i]);
else
MultiplePack(a[i],a[i],c[i]);
}
int ans=;
for(int i=;i<=m;i++)
if(f[i]==i) ans++;
printf("%d\n",ans);
}
return ;
}

hdu 2844 混合背包【背包dp】的更多相关文章

  1. HDU 2844 混合背包、

    题意:一个人想买手表,给你n个价值的硬币,然后给你n个价值硬币对应的个数.但是呢,这个人只知道这个手表的价格不超过m元.问他最多能买多少种价值的手表 思路:dp背包专题 但是- - 一直不知道该怎么d ...

  2. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

  3. HDU 2844 Coins (多重背包计数 空间换时间)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. HDu -2844 Coins多重背包

    这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...

  5. hdu 2844 coins(多重背包 二进制拆分法)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  6. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  7. HDU 2844 Coin 多重背包

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. hdu 2844 Coins 多重背包(模板) *

    Coins                                                                             Time Limit: 2000/1 ...

  9. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

随机推荐

  1. python-web-webbrower-beautifuSoup

    webbrowser:是 Python 自带的,打开浏览器获取指定页面. requests:从因特网上下载文件和网页. Beautiful Soup:解析 HTML,即网页编写的格式. seleniu ...

  2. win10上的vs2015项目到win7的2015无法使用

  3. java 中Vector的使用详解

    Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提 ...

  4. 【python之路35】网络编程之socket相关

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  5. 你不知道的javascript -- 数据类型

    1. 数据类型 在js中有7中数据类型 其中6种是基本类型 包括 null, undefined, boolean, number, string和symbol,还有一种是引用类型object 但是判 ...

  6. 锋利的JQuery学习之JQuery中的事件

    一.加载DOM 在页面加载完毕之后,浏览器会通过javascript为dom元素添加事件,在常规的javascript中使用window.onload方法,而在jQuery中使用的是$(documen ...

  7. mysql连接出现Unknown system variable 'tx_isolation'异常

    出现这个异常,是因为mysql-connector-java.jar的版本太低,数据库的版本太高,不匹配导致的. 因此将mysql-connector-java升级到最新版本就解决了问题. 最新的三个 ...

  8. 100个常用的原生JavaScript函数

    1.原生JavaScript实现字符串长度截取 复制代码代码如下: function cutstr(str, len) {    var temp;    var icount = 0;    var ...

  9. linux常用目录介绍

    bin:全称binary,含义是二进制,该目录中存放的都是一些二进制文件,这些文件都是可以被运行的. dev:该目录主要存放的是外接设备,例如:光盘等.注意:在其中的设备是不能被直接使用的,需要挂载( ...

  10. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...