博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1658 购物
阅读量:4356 次
发布时间:2019-06-07

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

题目描述

你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个。为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值。

题目分析

题目要求组合出1到X之间的任意值,那么面值之中没有1的话就无法组合出1,所以面值中没有1即为无解的情况,而1也是必须要选的面值。

对于值T,若我们已经能够组合出1~T-1中所有的值,而T是当前选用的硬币无法组合出的,那么我们再选一个面值为V(V≤T)的硬币,则T=T-V+V,其中T-V是我们已经能够组合出的值。同时,我们使用这些硬币还可以组合出V+1~V+T-1中所有的值,下一个无法组合的值就可以从V+T开始考虑。由于我们要求硬币的最小值,我们每次选择硬币中满足条件的最大面值即可。

代码

1 #include
2 #include
3 using namespace std; 4 const int t[11]={
0,1,2,5,10,20,50,100,200,500,1000}; 5 int x,n,ans,a[11]; 6 bool vis[1001]; 7 int main() 8 { 9 scanf("%d%d",&x,&n);10 for(int i=1;i<=n;++i)11 scanf("%d",&a[i]);12 sort(a+1,a+n+1);13 if(a[1]!=1)14 puts("-1");15 else16 {17 for(int now=1;now<=x;)18 for(int i=n;i>0;--i)19 if(a[i]<=now)20 {21 now+=a[i];22 ++ans;23 break;24 }25 printf("%d",ans);26 }27 return 0;28 }
购物

 

转载于:https://www.cnblogs.com/Psephurus-Gladius-zdx/p/10800611.html

你可能感兴趣的文章
[ 原创 ] Linux下查找指定类型文件以及删除
查看>>
win10环境下jdk1.8+Android Developer Tools Build: v22.3.0-887826的问题
查看>>
辗转相除法求最大公约数
查看>>
Centos7 安装mysql5.7.16
查看>>
java串口通信与打卡器交互
查看>>
<CoreJava> 5.2 Object:所有类的超类
查看>>
输入年月日计算是星期几
查看>>
redis部分配置与报错解决
查看>>
Python Challenge(0-8)
查看>>
oracle中的trunc()函数
查看>>
对大一一年的总结和对大二的规划
查看>>
结构化程序设计04 - 零基础入门学习Delphi13
查看>>
密码学基础
查看>>
Java基础Map接口+Collections工具类
查看>>
OSGI基础知识整理
查看>>
Revit 开发将自己的窗口设置为Revit窗口
查看>>
倾斜摄影数据OSGB转换成3DML(转载)
查看>>
给年轻程序员的几句话
查看>>
ionic如何uglify和minify你的js,css,image,png....
查看>>
[LeetCode]Minimum Depth of Binary Tree
查看>>