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 ...
随机推荐
- spring揭秘读书笔记----ioc的基本概念
在看ico概念之前,先想一下我们平常需要依赖某个类时会怎么做? 无非是在要用到的地方写如下代码: Person person = new Person(); //然后就可以用person对象来获取Pe ...
- MySQL 慢查询日志(Slow Query Log)
同大多数关系型数据库一样.日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件.通常包含错误日志文件,二进制日志,通用日志.慢查询日志.等等.这些日志能够帮助我们定位mysqld内 ...
- Java客户端Jedis
使用Jedis的Java客户端 maven依赖 <!-- jedis --> <dependency> <groupid>redis.clients</gro ...
- PHP抓取网络数据
涉及到的知识点不多 file_get_contents:读取数据: preg_match_all:正则匹配: 和匹配之后的数据分析. 不同网页所需要抓取的数据是不同的,所以正则表达式自然也不一样,针对 ...
- SHELL $RANDOM产生的随机数范围是0到32767
1.使用系统的 $RANDOM 变量 fdipzone@ubuntu:~$ echo $RANDOM 17617 fdipzone@ubuntu:~$ echo $RANDOM 17617 $RAND ...
- mysql日期函数 和sql语句扩展information_schema show processlist;
SELECT NOW(); SELECT CURDATE(); SELECT YEAR(NOW()) SELECT CONCAT("mysqldump ","-uroot ...
- 获取jsapi_ticket
String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&a ...
- 我的第二个java程序 循环
public class Test {//类 public Test (int num){//构造方法,和类同名,无返回值,接收传参并定义传参的类型,大小写敏感 int x = 10;//局部变量,定 ...
- Spring MVC文本域
以下示例显示如何在使用Spring Web MVC框架的表单中使用文本域(TextArea).首先使用Eclipse IDE来创建一个WEB工程,并按照以下步骤使用Spring Web Framewo ...
- Struts2 Action/动作
动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能 ...