1031: 最少钱币数

1031: 最少钱币数

时间限制: 1 Sec  内存限制: 128 MB
提交: 156  解决: 127
[提交][状态][讨论版]

题目描述

这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了 6 种钱币面值为 2、5、10、20、50、100,用来凑 15 元,可以用 5 个 2 元、1个 5 元,或者 3 个 5 元,或者 1 个 5 元、1个 10 元,等等。显然,最少需要 2 个钱币才能凑成 15 元。
        你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。

输入

输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值 M(1 <= M<= 2000,整数),接着的一行中,第一个整数 K(1 <= K <= 10)表示币种个数,随后是 K个互不相同的钱币面值 Ki(1 <= Ki <= 1000)。输入 M=0 时结束。

输出

每个测试用例输出一行,即凑成钱数值 M 最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。

样例输入

15
6 2 5 10 20 50 100
1
1 2
0

样例输出

2
Impossible

提示

来源

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
 int money,n,i,s,a[10];
 while(cin>>money){
  s=0;
  if(money==0) break;
  cin>>n;
  for(i=0;i<n;i++){
   cin>>a[i];
  }
  sort(a,a+n);
  for(i=n-1;i>=0;i--){
   if(money>=a[i]){
    s=s+money/a[i];
    money=money%a[i];
   }
   if(money==0) break;
  }
  if(money!=0) cout<<"Impossible"<<endl;
  else cout<<s<<endl;
 }
 
 
 return 0;
}

时间: 2024-10-01 01:32:32

1031: 最少钱币数的相关文章

最少钱币数:

最少钱币数 [问题描述] 这是一个古老而又经典的问题.用给定的几种钱币凑成某个钱数,一般而言有多种方式.例如:给定了6种钱币面值为2.5.10.20.50.100,用来凑 15元,可以用5个2元.1个5元,或者3个5元,或者1个5元.1个10元,等等.显然,最少需要2个钱币才能凑成15元. 你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数. [要求] [数据输入]输入可以有多个测试用例.每个测试用例的第一行是待凑的钱数值M(1 <= M <= 20

【动态规划专题】3:换钱的最少货币数

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 换钱的最少货币数 [题目] 给定数组arr, arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,代表要找的钱数,求组成aim的最少货币数. [举例]arr=[5,2,3],aim=204张5元可以组成20元,其他找钱方案都要使用更多的货币,所以返回4. arr=[5,2,3],aim=0不用任何货币就可以组成0元,返回0 arr=[3,5],aim=2根本没法组

换钱最少货币数

给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 代码: public class MinCoins { public static int minCoins(int[] arr, int aim) { if(arr == null || arr.length==0 || aim<=0) { return 0; } int len = arr.length; int max =

动态规划-换钱最少货币数

#encoding:utf-8 _author_ = "Wang Wenchao" #换钱最少的货币数 #给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个正数aim代表要找的钱数,求组成aim的最少货币数 ''' arr=[5,2,3],aim=20 4张5元可以组成20元,所以返回4 arr=[5,2,3],aim=0 返回0 arr=[3,5],aim=2 返回-1 ''' #解法:arr长度为N,生成行数为N的,

算法笔记——硬币找零之最少硬币数

题目来源:NYOJ995 问题描述: 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还

算法之Python实现 - 002 : 换钱的最少货币数补充(每种货币只能使用一次)

[题目]:给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币仅可以使用一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额外空间复杂度O(N*aim) import numpy as np from xmlrpc.client import MAXINT def mincoin(arr,aim): if len(arr)<0: print("No coin provided for change!")

[程序员代码面试指南]递归和动态规划-换钱的最少货币数

题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0到i种货币,凑成j元的最小货币张数. 初始化: 转移方程: dp[i][j]=min{dp[i-1][j-k*arr[i]]+k} (k>=0) 整理得 dp[i][j]=min{dp[i-1][j],min{dp[i-1][j-k*arr[i]]+k}} (k>=1) 变换得 dp[i][j]=

最大不相交区间数+最少区间数覆盖问题 贪心思想

最大不相交区间数的一道题是hdu2037 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037 题目给出n个区间,问最多有多少个区间没有重叠,只需要对区间右端点进行排序就行,因为一个节目结束得早的话就会为其他节目留下更多的时间,如果选择对节目的开始时间进行排序的话就会导致有一个节目迟迟不结束使得其他节目又没法开始的现象.右端点最小的第一个区间时一定要选的.这个可以简单地将其他右端值更大的区间跟他交换,就会发现不会产生更多的区间数,只会小于等于我们

数组的最少补丁数

距上一次写博客已是好久了,也是因为自己当时心理比较脆弱,面试的时候面试官跟我说我写的这些东西毛用没有确实当时是给我当头一棒,冷水浇头,然而现在领导给了我一些鼓励,所以我就又来耕耘了. 问题: 给一个升序排序后的数组 nums 和一个整数 N,在数组中添加若干个元素(数) 使得 1-N 内所有的数都可以表示成 nums 中若干数的和.求最小需要的补丁数. 无关紧要的吐槽:其实这个问题还是不完整的,数组中允许重复吗? 数组中的元素是否可以重复使用呢? 解决的关键在于要明白一个数学上的事情:最少可以使