#include <iostream>
#include <string>
#include<limits>
using namespace std;
typedef struct {
int ncoin; //使用的硬币数量
int addcoin; //从上一个状态到当前状态所用
int lasttotal;
}state;
int main()
{
/*
给定一个总数,其中硬币种类为1,3,5,且数量不限,求给出最佳的兑换方案:硬币数最少
*/
int total=12;
//cin>>total;
int coin[3]= {1,3,5};
state * sum = (state * )malloc ( sizeof(state) * (total+1));
for (int i =0;i<=total;i++)
{
sum[i].ncoin = 1111;//尽量大的数
}
sum[0].ncoin =0;
sum[0].lasttotal = 0;
for (int i = 1;i<=total;i++)
{
for (int j = 0;j<3;j++)
{
if ( i-coin[j]>=0 && sum[i-coin[j]].ncoin+1<sum[i].ncoin)
{
sum[i].ncoin = sum[i-coin[j]].ncoin+1;
sum[i].addcoin = coin[j];
sum[i].lasttotal = j;
}
}
}
if (sum[total].ncoin == 1111)
{
cout<<" NO CHANGE!!"<<endl;
return 0;
}
else
{
cout<<"least coin number is "<<sum[total].ncoin<<endl;
}
return 0;
}