一道编程题,求高手指点。新手发帖,请多关照。

a5511258 2011-03-24 12:41:21
题目是这样的:
最少钱币数:
【问题描述】
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了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



不明白那里错了,求指点。
...全文
151 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
peterdzw 2012-09-07
  • 打赏
  • 举报
回复
楼主您好,你的算法有点问题哦,你可以试一组参数
12
2 10 4

正确结果应该是3 用3个4
而跑你的程序是1.
moorsf 2011-03-24
  • 打赏
  • 举报
回复
如下:
        default :
//printf("%d",k);
printf("%d",result[i]);
break;
zhao0829wang 2011-03-24
  • 打赏
  • 举报
回复
int i,k,count=0;
int money,type_num;
int type[10];
int result[300];
一行就够了,为什么要写4行啊。
一曲肝肠断 2011-03-24
  • 打赏
  • 举报
回复
刚才有错

#include <cstdlib>
#include <iostream>
using namespace std;

const int mkind[] = {1, 2, 5, 10, 20, 50, 100};
#define arrlen sizeof(mkind)/sizeof(int)

int getsuitablepos(int im){
int i, ir;
for(i =0, ir =0; ((mkind[i] > im) ? i = arrlen: ir = i), i< arrlen; i++);
return ((ir >= arrlen) ? arrlen -1: ir);
}
bool findtype(int im)
{
int i, ip = getsuitablepos(im);
if (im == mkind[ip])
{
cout<< "Possible"<< endl << im << ", ";
return true;
}
if(im < mkind[ip])
return false;
for(i = ip; i + 1; i--)
{
if(findtype(im - mkind[i]))
{
cout<< mkind[i] << ", ";
return true;
}
}
return false;
}
int main(int argc, char *argv[])
{
int imoney = 341; //输入钱数
if(!findtype(imoney))
cout<< "Impossible"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
一曲肝肠断 2011-03-24
  • 打赏
  • 举报
回复
偶也写个练练手,放出来丢丢人,哈哈

#include <cstdlib>
#include <iostream>
using namespace std;

const int mkind[] = {1, 2, 5, 10, 20, 50, 100};
int getsuitablepos(int im){
int i, ir;
for(i =0, ir =0; ((mkind[i] > im) ? i = sizeof(mkind): ir = i), i< sizeof(mkind); i++);
return ir;
}
bool findtype(int im)
{
int i, ip = getsuitablepos(im);
if (im == mkind[ip])
{
cout<< "Possible"<< endl << im << ", ";
return true;
}
if(im < mkind[ip])
return false;
for(i = ip; i + 1; i--)
{
if(findtype(im - mkind[i]))
{
cout<< mkind[i] << ", ";
return true;
}
}
return false;
}
int main(int argc, char *argv[])
{
int imoney = 74; //输入钱数
if(!findtype(imoney))
cout<< "Impossible"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
张明云 2011-03-24
  • 打赏
  • 举报
回复
楼上说得有道理,你这记录的数据是放在result数组里面的。

#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",result[i]);
break;
}
printf("\n");
}
}

a5511258 2011-03-24
  • 打赏
  • 举报
回复
细节啊,呵呵
多谢

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧