一道编程题,求高手指点。新手发帖,请多关照。
题目是这样的:
最少钱币数:
【问题描述】
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了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 "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
不明白那里错了,求指点。
最少钱币数:
【问题描述】
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了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 "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
不明白那里错了,求指点。
...全文
相关推荐
发帖脚本脚本 自动 发帖
脚本 自动 发帖脚本 自动 发帖脚本 自动 发帖脚本 自动 发帖脚本 自动 发帖脚本 自动 发帖
有关一道身份证的python编程题
有关一道身份证的题目,要求python解决 就昨天晚上嗷一个妹纸问我这样一道问题哈: 问题: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2 现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。 输入格式: 输入第一行给出正整数N(≤100)是输入
求大佬指点指点,SQL基础培训练习题以及解题思路
求大佬指点指点,SQL基础培训练习题以及解题思路
C语言100道经典编程题
本文档囊括了C语言的大部分基础知识,有利于刚学习C语言的同学深入了解。
Java基础编程题(内含答案)新手入门
Java基础编程题,内含答案,适合新手练习。不错的入门训练题目,有助于基础的提高。


