题目大概的意思就是:小强用硬币买东西,硬币有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 20003int 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背包,思路跟第二个版本也差不多。

转载于:https://www.cnblogs.com/dengyaolong/p/3697220.html

HDU3591找零,背包相关推荐

  1. 最少硬币找零系列问题(01背包,完全背包,多重背包动态规划)

    背包问题思路解决最小硬币找零系列问题. 一.01硬币找零问题(01背包) 给定不同面额的硬币 coins 和总金额 m.每个硬币最多选择一次.计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬 ...

  2. NYOJ995 硬币找零(完全背包)

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

  3. nyoj995硬币找零完全背包

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

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

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

  5. Java - 初探贪心算法(纸币找零,背包问题)

    贪心算法 1. 什么是贪心算法? 二.贪心算法的基本思路 三.贪心算法适用的问题 四.贪心算法的实现框架 五.贪心策略的选择 六.贪心算法的几个例子 1. 纸币找零问题 2. 背包问题 1. 什么是贪 ...

  6. 字节跳动校招题目——找零问题

    题目描述 Z国的货币系统包含面值1元.4元.16元.64元共计4种硬币,以及面值1024元的纸币.现在小Y使用1024元的纸币购买了一件价值为N(0<N≤1024)的商品,请问最少他会收到多少硬 ...

  7. 硬币找零问题的动态规划实现

    一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4   待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总 ...

  8. 猴子摘香蕉问题python_硬币找零爬楼梯猴子摘香蕉

    硬币找零&&爬楼梯&&猴子摘香蕉 假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. #include"CoinPr ...

  9. 硬币找零——背包问题,以及循环、递归、动规共通性

    在这个题目的基础上,我了解了一下这几个"编程写法",并对循环.递归.dp有了新的想法.从原理上,这几个想法都是大事化小.小事化了.只不过方向不同罢了. 根据The Algorith ...

最新文章

  1. Spring基于注解的AOP配置
  2. 选择所有选项的多选复选框列表或复选框下拉列表
  3. Android 2.3发短信详细流程
  4. 用最通俗易懂的方式打开区块链!
  5. Xshell 5 家庭和学校版下载
  6. cass转换jpg_【转】南方CASS作原有地形图数字化--对扫描栅格图像进行校正及矢量化...
  7. ffmpeg命令下载MP4视频)
  8. 地理信息系统(GIS)与数字地球
  9. (自学java的第三天)JPI文档、变量、数据类型
  10. R7 4800U和i7 9700K 哪个好
  11. 计算机能使用硬盘吗,电脑内置硬盘可以直接当移动硬盘用吗?
  12. IOS数据库操作SQLite3使用详解(转)
  13. 中国计算机学会会刊变动公告
  14. PrimoCache2.2.0汉化程序与2.0.0的交叉使用
  15. 启动模式,BOOT0和BOOT1详解
  16. 每日一练||用Java图形界面实现加减乘除功能的计算器
  17. PCB(AD)转HFSS进行电磁仿真
  18. 谈谈深度学习中的 Batch_Size Batch_Size(批尺寸)是机器学习中一个重要参数,涉及诸多矛盾,下面逐一展开。 首先,为什么需要有 Batch_Size 这个参数? Batch 的选
  19. Revit中建筑柱和结构柱的区分以及梁的搭建之学习记录
  20. 马赛克数据增强 mosaic

热门文章

  1. // 产生10到100随机数
  2. 计算机中如何取消家长控制用户,电脑怎么设置家长控制? 家长控制功能的使用技巧...
  3. LNMP(linux+nginx+mysql+php)服务器环境配置
  4. Box2D物理引擎的使用方法
  5. Mysql一直显示等待中_Mysql中的各种timeout
  6. android recyclerview多布局_图文讲解RecyclerView的复用机制 ||Recyclerview进阶
  7. 数组-scala数组与java的list的互转
  8. LeetCode 105. 从前序与中序遍历序列构造二叉树(递归)
  9. YUV 格式与 RGB 格式的相互转换公式总结(C++版)
  10. notepad++ 配置C/C++环境