/*
在某国家,法定的币制包含n种硬币,面值分别为d1,d2,...,dn。要求用这些硬币会总额为m的帐,写一个程序,计算最少用到的硬币个数以用每种面值的用数。假设每种面值硬币的供应量总够多。
输入样例:
n=3 ;n种硬币
1
4
6
相应的正确输出样例:
m=8 ;总额为m的账
4 4 ;最少用到的硬币个数以用每种面值的用数
*/
#include<stdio.h>
#define ArraySize 20
void
main()
{
int stack[ArraySize],ip,flag,i;
int n,sum,m;
int kind[ArraySize];
/* 输入硬币的种数 */
do{
printf("n=");
scanf("%d",&n);
}while(n<=0);
/* 输入各种硬币的面值 */
printf("/nkind:/n");
for(i=0;i<n;i++)
scanf("%d",&kind[i]);
/* 输入要付的钱 */
printf("m=");
scanf("%d",&m);
/* 初始化 */
for(i=0;i<ArraySize;i++)
stack[i]=0;
ip=0;
while(1)
{
flag=0;
if(stack[ip]>=n)
{
for(ip=0;stack[ip]==n;ip++)
{
stack[ip]=1;
flag=1;
}
if(flag==1)
stack[ip]++;
else
ip=0;
}
else
{
ip=0;
stack[ip]++;
}/* if */
for(sum=0,i=0;stack[i]!=0;i++)
{
sum=sum+kind[stack[i]-1];
}
/* 输出最少用到的硬币个数以用每种面值的用数并退出循环 */
if(sum==m)
{
for(i=0;stack[i]!=0;i++)
printf("%d ",kind[stack[i]-1]);
break;
}
}/* while */
getch();
}