HDU 3591 多重背包
给出N种钱币和M
给出N种钱币的面值和个数
NPC拿着这N些钱币去买价值M的物品,能够多付。然后被找零,找零的钱也为这些面值。但没有数量限制
问最少经手的钱币数量
对于NPC做一个付款多重背包
然后对于找零做一个全然背包
ans=Min(dp1[i]+dp2[i-m],ans);
#include "stdio.h"
#include "string.h" int n,m;
int dp1[20010],dp2[20010],c[20010],v[20010];
void onezero_pack(int v,int k)
{
int i;
for (i=20000;i>=v;i--)
if (dp1[i-v]!=-1 && (dp1[i-v]+k<dp1[i] || dp1[i]==-1) )
dp1[i]=dp1[i-v]+k;
} void complete_pack(int v)
{
int i;
for (i=v;i<=20000;i++)
if (dp1[i-v]!=-1 && (dp1[i-v]+1<dp1[i] || dp1[i]==-1) )
dp1[i]=dp1[i-v]+1;
} void multiple_pack(int v,int c)
{
int k;
if (v*c>=20000)
complete_pack(v);
else
{
k=1;
while (k<c)
{
onezero_pack(k*v,k);
c-=k;
k*=2;
}
if (c>0) onezero_pack(c*v,k);
}
} int Min(int a,int b)
{
if (a<b) return a;
else return b;
}
int main()
{
int Case,i,j,ans;
Case=0;
while (scanf("%d%d",&n,&m)!=EOF)
{
if (n+m==0) break;
for (i=1;i<=n;i++)
scanf("%d",&v[i]);
for (i=1;i<=n;i++)
scanf("%d",&c[i]); memset(dp1,-1,sizeof(dp1));
dp1[0]=0; for (i=1;i<=n;i++)
multiple_pack(v[i],c[i]); memset(dp2,-1,sizeof(dp2));
dp2[0]=0;
for (i=1;i<=n;i++)
for (j=0;j<=20000-v[i];j++)
{
if (dp2[j]!=-1 && (dp2[j]+1<dp2[j+v[i]] || dp2[j+v[i]]==-1) )
dp2[j+v[i]]=dp2[j]+1;
} ans=0x3f3f3f3f;
for (i=m;i<=20000;i++)
if (dp1[i]!=-1 && dp2[i-m]!=-1)
ans=Min(dp1[i]+dp2[i-m],ans); printf("Case %d: ",++Case);
if (ans==0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}
HDU 3591 多重背包的更多相关文章
- hdu 5445 多重背包
Food Problem Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- HDU 3591 (完全背包+二进制优化的多重背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 M ...
- hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- Big Event in HDU(HDU 1171 多重背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1171 Big Event in HDU (多重背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU1171--Big Event in HDU(多重背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Big Event in HDU(多重背包套用模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...
- hdu 1059 (多重背包) Dividing
这里;http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意是有价值分别为1,2,3,4,5,6的商品各若干个,给出每种商品的数量,问是否能够分成价值相等的 ...
- 题解报告:hdu 1171 Big Event in HDU(多重背包)
Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. Bu ...
随机推荐
- 在WebService中使用Microsoft.Practices.EnterpriseLibrary.Data配置数据库
1. 新建WebApplication1项目 1.1 新建—Web—ASP.NET Empty Web Application--WebApplication1 1.2 添加一个WebForm1 2. ...
- 【Akka】在并发程序中使用Future
引言 在Akka中, 一个Future是用来获取某个并发操作的结果的数据结构.这个操作一般是由Actor运行或由Dispatcher直接运行的. 这个结果能够以同步(堵塞)或异步(非堵塞)的方式訪问. ...
- C语言基础(18)-内存
一.内存布局 1.1 代码区 代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段.代码区是可读不可写的. 代码区中的所有的内容在程序加载到内存的时候就确定了,运 ...
- PIL之基础应用
>>> from PIL import Image >>> #读取图像文件 ... >>> gal=Image.open('/Users/simi ...
- EEPlat的元模型体系
EEPlat的元模型体系是元数据驱动的必要条件之中的一个.仅仅有通过元模型可以完好的描写叙述一个软件系统.才可以完整的定义该软件系统的元数据,也才干真正实现软件系统的元数据驱动式开发.也就意味着一个软 ...
- 一个奇怪的EL表达式错误
下图是在Struts2的action中写的一个方法 JSP页面代码如下: 在页面访问如下路径:http://localhost:8088/maven_ssh/cust_getCustList 目前推测 ...
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)什么意思??
从hibernate2.1开始ehcache已经作为hibernate的默认缓存方案(二级缓存方案 sessionfactory级别), 在项目中有针对性的使用缓存将对性能的提升右很大的帮助. 要使用 ...
- valgrind调查内存leak
快有几个月没更新了,记录一下最近解决问题用到的工具吧. 最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在Android上用上了大名顶顶的valgrind,说实话,真是名不虚传, 真是建议以后 ...
- [搬家]新域名 akagi201.org
现在感觉自己做了好多年的垃圾信息制造者 以后只在网络上发布有用的东西, 垃圾或者对别人没用的东西就放到自己的硬盘上把 http://akagi201.org
- python 爬虫1 Urllib库的基本使用
1.简单使用 import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.re ...