题意:

有1,5,10,25四种硬币,给每种硬币的数量和要组合成的价值,求刚好达到价值时用的硬币最多,然后还要输出具体的用的数量

前言:

一开始是偶然看见了kuangbin爷的题解说是完全背包+路径,很好奇啊。

思路(kuangbin爷代码 Orz):

一个完全背包,加个计数,加个路径。

因为题目要求是求一个max硬币数量,所以直观上我们感觉就是面值小的硬币用的越多越好,然后在dp更新的时候,基于小面值使用大面值。所以val数组是从小到大,目的是尽可能使用更多的小面值硬币达到dp数组是每次都是最多的。然而如果是求最小硬币数,直接就可以把面值数组掉一下头就好啦~

突然有个问题(太弱就会瞎想):

有没有存在可能被给出的P面值没有被更新到,虽然dp数组判断条件是判断谁大,所以初始化0就好了(P>=1),一旦符合就是有符合的条件。所以是成立。

忽略以上的问题,利用完全背包的思想:

首先在更新的时候必须保证dp[j-val[i]]>=0的,第一枚硬币的更新是以 j-val[i] = 0为基础开始的,以至于dp数组才可以代表的是 j 面值的最大硬币数。所以初始化dp是负数。

然后加一个cnt,非常nice的一个想法。

具体写法:

①:我们可以开一个num数组去记录某价值下的某硬币的使用情况。

②:我们可以开个pre数组去记录一下某 j 面值的前面的j-val[i],然后递归到0,中间的差值就是被使用价值的硬币,再开一个数组记录一下就好了。

除了这个方法,还有多重背包+路径;

贴一发挫code……….

#include<cstdio>
#include<iostream>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
typedef __int64 LL; const int N=1e4+10; int val[4]={1,5,10,25}; int dp[N]; //在该面值的最大硬币数量
int num[5];
int pre[N];//记录背包路径
int cnt[N];//每次更新是临时计数
int ans[30]; //计数 int main()
{
int n;
int t;
bool flag=true;
while(1)
{
scanf("%d",&t);
for(int i=0;i<4;i++)
{
scanf("%d",&num[i]);
if(num[i]) flag=true;
}
if(!t&&!num[0]&&!num[1]&&!num[2]&&!num[3]) break;//在这里wa了,以后判0乖乖这样做。 memset(pre,0,sizeof(pre));
memset(dp,-1,sizeof(dp)); dp[0]=0;
pre[0]=-1; for(int i=0;i<4;i++)
{
memset(cnt,0,sizeof(cnt));
for(int j=val[i];j<=t;j++)
{
if(dp[j-val[i]]>=0&&(dp[j-val[i]]+1)>dp[j]&&num[i]>cnt[j-val[i]])//首先dp[j-val[i]]>=0,因为要保证你前面那个是满足的
{
dp[j]=dp[j-val[i]]+1;
cnt[j]=cnt[j-val[i]]+1;
pre[j]=j-val[i];
}
}
} if(dp[t]<0)
{
printf("Charlie cannot buy coffee.\n");
continue;
}
//printf("%d\n",dp[t]); memset(ans,0,sizeof(ans));
int x=t;
while(1)
{
if(pre[x]==-1) break;
ans[x-pre[x]]++;
x=pre[x];
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",ans[1],ans[5],ans[10],ans[25]);
}
return 0;
}

最新文章

  1. maven+ssm+cxf3配置例子
  2. 【BO】SAP BO相关问题汇总贴
  3. php mysql 一个查询优化的简单例子
  4. hdu1402 FFT入门
  5. 【jquery】:表单返回信息
  6. 设计模式之美:Composite(组合)
  7. android开源项目和框架
  8. hdu4649Professor Tian
  9. SGU 122.The book (哈密顿回路)
  10. WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
  11. 分布式系统的消息&amp;服务模式简单总结
  12. Jenkins简明入门(二) -- 利用Jenkins完成Python程序的build、test、deployment
  13. 织梦5.7sp1最新问题:后台不显示编辑器
  14. HDU - 1827 Summer Holiday (强连通)
  15. Spring MVC -- Spring框架入门(IoC和DI)
  16. ActiveMQ中Broker的应用与启动方式
  17. .NET之美 第一部分C#语言基础
  18. 针对 FastAdmin 2018-01-19 号的升级 SQL (废)
  19. 企业搜索引擎开发之连接器connector(二十四)
  20. Apache 403 错误解决方法-让别人可以访问你的服务器(转)

热门文章

  1. Invocation of destroy method failed on bean with name ‘XXXX’
  2. [UnityUI]一些有趣的UI样例
  3. 查询mysql字段名和字段注释
  4. BFS和DFS记录路径
  5. vs2010配置VL_FEAT库
  6. vue 计算属性与侦听器
  7. 转载:用python爬虫抓站的一些技巧总结
  8. sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)
  9. 答案{{index==0 ? &#39;一&#39; : (index==1 ? &#39;二&#39;:&#39;三&#39; )}}
  10. 使用NetBeans生成jar包,并在jar包中添加资源