题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi)

问最小交易硬币数,就是一个有找零的背包问题啦。

我的上一篇博客跟这hdu3591的类型非常非常接近,所以我很快就写完,并且很快地WA了无数次。

后来很苦恼,看看别人写的代码,他们的思想大概是这样子。用dp2去记载找零,就是dp2[i]=min{dp2[i],dp2[i-V]+1 } V为要付的总款

之后再从V到INF处得到ans=min{ans,dp[i]+dp2[i-V]};

思路是很清晰啦,很快我又CODE了一段。

马上又WA了无数次。

正当我无力时候,我发现!!!!原来是我的ZeroOnePack的参数写错了...第二个版本,改了参数后,马上就Accepted了!!!!!!!

先发个第二个版本的。

#include"stdio.h"
#include"string.h"
#define m 105
#define m3 20005
int V=m3;
int N;
int c[m],n[m],dp[m3+1],dp2[m3+1];
int min(int a,int b){
return a<b?a:b ;
}
void ZeroOnePack(int vol,int val){
int i;
for(i=V;i>=vol;i--)
dp[i]=min(dp[i],dp[i-vol]+val); }
void CompletePack(int vol,int val){
int i;
for(i=vol;i<=V;i++)
dp[i]=min(dp[i],dp[i-vol]+val); }
void MultPack(int vol,int val,int num){
int k;
if(num*vol>=V){
CompletePack(vol,val);
return ;
}
k=1;
while(k<num){
ZeroOnePack(k*vol,k*val);
num-=k;
k<<=1; }
ZeroOnePack(num*vol,num*val); } int main(){
int i,j,V1,ca=1,ans; while(scanf("%d%d",&N,&V1)&&(N||V1)){
memset(dp,63,sizeof(dp));
dp[0]=0;
memset(dp2,63,sizeof(dp2));
dp2[0]=0;
for(i=1;i<=N;i++)
scanf("%d",&c[i]);
for(i=1;i<=N;i++)
scanf("%d",&n[i]); //给钱
for(i=1;i<=N;i++)
MultPack(c[i],1,n[i]); //找零
for(i=1;i<=N;i++)
for(j=c[i];j<=V;j++)
dp2[j]=min(dp2[j],dp2[j-c[i]]+1);
ans=0xfffffff;
for(i=V1;i<=V;i++)
ans=min(ans,dp[i]+dp2[i-V1]); printf("Case %d: %d\n",ca++,ans==0xfffffff?-1:ans); }; return 0; }
10325750 2014-03-17 22:21:06 Accepted 3591 78MS 388K 1403 B C deron

后来,我又把我第一个版本给改了一下,交了。毫无问题,Accepted

#include"stdio.h"
#include"string.h"
#define m 103
#define m3 20003 int V=m3;
int N;
int c[m],n[m],dp[m3+1];
int min(int a,int b){
return a<b?a:b ;
}
void ZeroOnePack(int vol,int val){
int i;
for(i=V;i>=vol;i--)
dp[i]=min(dp[i],dp[i-vol]+val); }
void CompletePack(int vol,int val){
int i;
for(i=vol;i<=V;i++)
dp[i]=min(dp[i],dp[i-vol]+val); }
void MultPack(int vol,int val,int num){
int k;
if(num*vol>=V){
CompletePack(vol,val);
return ;
}
k=1;
while(k<num){
ZeroOnePack(k*vol,k*val);
num-=k;
k<<=1; }
ZeroOnePack(num*vol,num*val); } int main(){
int i,j,V1,ca=1; while(scanf("%d%d",&N,&V1)&&(N||V1)){ for(i=1;i<=V;i++)
dp[i]=0xfffffff; dp[0]=0; for(i=1;i<=N;i++)
scanf("%d",&c[i]);
for(i=1;i<=N;i++)
scanf("%d",&n[i]); //给钱
for(i=1;i<=N;i++)
MultPack(c[i],1,n[i]); //找零
for(i=1;i<=N;i++)
for(j=V-c[i];j>0;j--)
dp[j]=min(dp[j],dp[j+c[i]]+1);
if(dp[V1]==0xfffffff)
dp[V1]=-1; printf("Case %d: %d\n",ca++,dp[V1]); }; return 0; }
10325819 2014-03-17 22:30:06 Accepted 3591 62MS 308K 2745 B C deron

其思想就是找零时候做一次01背包,思路跟第二个版本也差不多。

HDU3591找零,背包的更多相关文章

  1. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  2. codevs 3961 硬币找零【完全背包DP/记忆化搜索】

    题目描述 Description 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该 ...

  3. NYOJ995硬币找零(简单dp)

    /* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...

  4. POJ 3260 The Fewest Coins(多重背包问题, 找零问题, 二次DP)

    Q: 既是多重背包, 还是找零问题, 怎么处理? A: 题意理解有误, 店主支付的硬币没有限制, 不占额度, 所以此题不比 1252 难多少 Description Farmer John has g ...

  5. dp算法之硬币找零问题

    题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...

  6. NYOJ 995 硬币找零

    硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...

  7. usaco 最少找零

    Description 约翰在镇上买了 T 元钱的东西,正在研究如何付钱.假设有 N 种钞票,第 i 种钞票的面值为 Vi,约翰身上带着这样的钞票 Ci 张.商店老板罗伯是个土豪,所有种类的钞票都有无 ...

  8. [LeetCode] Coin Change 硬币找零

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  9. 【ACM小白成长撸】--贪婪法解硬币找零问题

    question:假设有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...

随机推荐

  1. Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 11102  Solved: 4490[Submit ...

  2. python-面向对象(三)——类的特殊成员

    类的特殊成员 1. __doc__     表示类的描述信息 class Foo: """ 描述类信息,这是用于看片的神奇 """ def ...

  3. 8-7-Exercise

    链接:第二次小练 这次是我们这组出的题目~我出了一道......B-Prison rearrangement,感觉有点复杂~不过其实题目想通了还是很简单的...... @荆红浅醉出的是A.C.D,@从 ...

  4. 微信开发第4章 通过accesstoken获取用户标签管理

    通过access_token获取用户标签管理: 1.获取标签列表 调用接口为: http请求方式:GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/t ...

  5. mysql查询一天,查询一周,查询一个月的数据【转】

    转自:http://www.cnblogs.com/likwo/archive/2010/04/16/1713282.html 查询一天: select * from table where to_d ...

  6. MariaDB设置主从复制[转载]

     3. MariaDB设置主从复制 标签: mariadbMySQL主从复制 翻译人员: 铁锚 翻译日期: 2013年12月25日 原文链接:  Setting Up Replication 主从复制 ...

  7. ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解

    这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...

  8. JSP/Servlet 中的事件处理

    写过AWT或Swing程序的人一定对桌面程序的事件处理机制印象深刻:通过实现Listener接口的类可以在特定事件(Event)发生时,呼叫特定的方法来对事件进行响应. 其实我们在编写JSP/Serv ...

  9. XC软件管理器应用

    这是一个基于android 4.4开发的android应用-XC软件管理器.包含应用的信息查看,打开应用以及应用的卸载等功能.非常实用的一个应用,欢迎大家下载使用. 下载地址:http://downl ...

  10. eclipse中svn插件的安装

    Svn(Subversion)是近年来崛起的版本管理工具,在当前的开源项目里(J2EE),几乎95%以上的项目都用到了SVN.Subversion项目的初衷是为了替换当年开源社区最为流行的版本控制软件 ...