最少钱币数

来源:互联网 发布:linux 显示文件夹内容 编辑:程序博客网 时间:2024/06/03 18:53

题目描述

        这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了 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”。你可以假设,每种待凑钱币的数量是无限多的。

样例输入

156 2 5 10 20 50 10011 20

样例输出

2

Impossible

#include<iostream>#include<string>using namespace std; int m[1000]; int M; int p; int check() {    int b,c,d=0;  int p=0;  int i,j;  int s[10];    cin>>b;  for( i=1;i<=b;i++)   cin>>s[i];     for( i=1;i<=b;i++)   for(j=1;j<=b-i;j++)    if(s[j]>s[j+1])    {     c=s[j];     s[j]=s[j+1];     s[j+1]=c;    } for( i=b;i>0;i--) {  while(M-s[i]>=0)  {   M-=s[i];   d++;  } } if(M<=0)  return d; else  return 0;}int main() {    int q;    do { cin>>M; q=M; if(q==0)  break; p++; m[p]=check(); }while(q>0); for(int j=1;j<=p;j++) {  if(m[j]==0)   cout<<"Impossible"<<endl;  else   cout<<m[j]<<endl; }return 0;}


0 0