最少硬币问题
#include<iostream>
#include<string>
#include<stdlib.h>
#define MAX 20002
#define INF 9999999
#define min(a,b) (a)>(b)?(b):(a)
int T[11],Coins[11],n;
int c[MAX];
int Cash[15][15];
int m;
void init()
{
int i;
printf("请输入硬币面值种数:");
scanf("%d",&n);
printf("\n请输入硬币面值及其此面值硬币个数:\n");
for(i=0;i<n;++i)
scanf("%d %d",&T[i],&Coins[i]);
printf("\n输入要找的钱数:");
scanf("%d",&m);
}
int main()
{
int i,j,k;
int p,q,count;
init();
for(i=0;i<=m;++i)
c[i]=INF;
c[0]=0;
for(i=0;i<n;i++)
for(j=0;j<=m;j++)
Cash[i][j]=0;
for(i=0;i<n;++i)
{
for(j=1;j<=Coins[i];++j)
{
for(k=m;k>=T[i];--k)
{
if(c[k]>c[k-T[i]]+1)
{
c[k]=c[k-T[i]+1];
Cash[i][k]=j;
for(p=i-1;p>=0;p--)
{
count=k;
for(q=i;q>p;q--)
count-=Cash[q][k]*T[q];
Cash[p][k]=count/T[p];
}
}
c[k]=min(c[k],c[k-T[i]]+1);
}
}
}
if(c[m]!=INF)
printf("\n最少硬币个数为:%d\n",c[m]);
else
printf("\n-1\n");
for(i=0;i<n;i++)
printf("需要面值为%d的硬币%d个\n",T[i],Cash[i][m]);
system("pause");
return 0;
}