博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Too Rich UVALive - 7183(贪心)
阅读量:4701 次
发布时间:2019-06-09

本文共 1055 字,大约阅读时间需要 3 分钟。

需要求的是取p钱,使总的取得硬币数最大

反向思考就是求取sum-p的钱,使总的取的硬币数最少
这样贪心起来就容易了
从最大的开始 我们可以观察 除了20 50和200 500之外其余的相邻的2个之间都是倍数关系
所以特殊除了这2个就可以了
又因为20是50+50的倍数 所以在取50的时候要考虑少取一个50的情况(200 500同)
比如有3个50的时候 50+50是20的倍数可以表示 但如果是50*3的话无法用20表示 需要都跑一下

#include
#define inf 0x3f3f3f3f#define mem(a,b) memset(a,b,sizeof(a))#define rep(i,a,b) for(int i=a;i<=b;i++)#define int long longusing namespace std;int a[15]={0,1,5,10,20,50,100,200,500,1000,2000};int mub[15],ans;void dfs(int sum,int t,int now){ if(sum==0) { ans=min(t,ans); return ; } if(now==0) return ; int m=sum/a[now]; m=min(m,mub[now]); dfs(sum-m*a[now],t+m,now-1); if(m) { m--; dfs(sum-m*a[now],t+m,now-1); }}#undef intint main(){#define int long long int t; cin>>t; while(t--) { ans=inf; int n,sum=0,all=0; cin>>n; rep(i,1,10) cin>>mub[i],sum+=a[i]*mub[i],all+=mub[i]; sum=sum-n; if(sum>0) dfs(sum,0,10); cout<<(ans==inf?-1:all-ans)<

转载于:https://www.cnblogs.com/minun/p/11504420.html

你可能感兴趣的文章
js正则
查看>>
thrift源码阅读笔记
查看>>
iOS UI基础-4.0应用程序管理
查看>>
在CentOS 6.4 x86_32中使用Rhythmbox听MP3
查看>>
sys模块
查看>>
BZOJ3073 : [Pa2011]Journeys
查看>>
BZOJ2213 : [Poi2011]Difference
查看>>
聊聊javascript的事件
查看>>
对象基础
查看>>
【MySQL比知必会】第九章 使用正则表达式进行搜索
查看>>
查看Oracle数据库名和实例名的命令
查看>>
20155302 2016-2017-2 《Java程序设计》第4周总结
查看>>
java Html 转 PDF
查看>>
C++ 标准库 permutation
查看>>
关于PCB开窗
查看>>
【蓝桥杯单片机07】彻底理解51单片机的中断系统
查看>>
款待奶牛
查看>>
APIO 2018选圆圈
查看>>
RabbitMQ,Redis
查看>>
C语言 可变参数的用法
查看>>