题目大概的意思就是:小强用硬币买东西,硬币有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. JavaScript---网络编程(4)-Date、Math、Global和自定义对象

    本节博客进行Date对象.Math对象.Global对象和自定义对象的用法演示. 首先是一个out.js文件内容(输出到网页中的自定义输出方法): function println(parma){ d ...

  2. 1003: A Bug

    题目链接:http://172.16.200.33/JudgeOnline/problem.php?id=1003 分析: (1)题意很简单,就是检查一堆数据中是否有同性恋,找出主要矛盾是如果1喜欢2 ...

  3. Web开发需要关注的技术细节

    摘要:在网站发布前,开发者需要关注有许多的技术细节,比如接口设计.用户体验.安全性.Web标准.性能.SEO等,倘若一个疏忽就会影响到整体的体验效果.作为一名Web开发者,哪些技术细节需要考虑呢? [ ...

  4. Spring框架整合Struts2

    1,用Spring架构,及Struts2-spring-plugin插件 导入Spring的dist全部所需的jar包 Struts2的spring插件 struts2-spring-plugin.X ...

  5. 在线App开发平台——应用之星傻瓜式开发平台

    随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度的技术活,所以很多时候有心无力,也担心APP的后续的技术支持. ...

  6. 8-6-Exercise

    HDU 1003    Max Sum 题意:给出一串数字,求出其中某段连续的数字之和最大的值,同时要输出起点的位置和终点的位置~~~ 方法一: 用sum记录某一段和的值,maxx为目前为止最大的su ...

  7. 我的ubuntu配置

    每次装系统都是非常蛋疼的过程,新装的系统还是要配置一下的 首先安装google拼音 sudo apt-get install fcitx fcitx-googlepinyin 然后按装numix主题 ...

  8. jqChart动态数据

    <link rel="stylesheet" type="text/css" href="../../css/jquery.jqChart.cs ...

  9. 【转】YUV420P的格式以及转换为RGB565的代码(Android摄像头的输出一般为YUV420P)

    http://blog.csdn.net/daisyhd/article/details/38866809 static void cvt_420p_to_rgb565(int width, int  ...

  10. poj 1226

    跟3294比较类似,但是不需要输出具体的串,比较简单,只要把串反转连接上去解法就一样了. #include <iostream> #include <cstdio> #incl ...