一道编程题,求高手指点。新手发帖,请多关照。
题目是这样的:
最少钱币数:
【问题描述】
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了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
我的程序是这样的:
[code=C/C++][/code]
#include "stdio.h"
void order(int *a,int m)
{
int i,j,t;
for(i=0;i<m-1;i++)
for(j=i;j<m;j++)
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int main()
{
int i,k,count=0;
int money,type_num;
int type[10];
int result[300];
scanf("%d",&money);
while(money!=0)
{
scanf("%d",&type_num);// 输入钱的种类数
for(i=0;i<type_num;i++)// 输入钱的种类
scanf("%d",&type[i]);
order(type,type_num);//种类排序
k=0;
for(i=0;i<type_num;i++)//计算最少用多少张
while(money/type[i]!=0)
{
money-=type[i];
k++;
}
result[count]=k;//记录数据
count++;
scanf("%d",&money);// 进入下次循环,录入被分的钱
}
for(i=0;i<count;i++)// 输出结果
{switch(result[i])
{
case 0:printf("Impossible");break;
default:printf("%d",k);break;
}
printf("\n");
}
}
我按题目给的数据测试,输出的结果却是:
0
Impossible
不明白那里错了,求指点。
[解决办法]
如下:
- C/C++ code
default : //printf("%d",k); printf("%d",result[i]); break;