看到了http://blog.csdn.net/kangroger/article/details/36036101 这文章,由于我不太懂他的代码,所以我按他的题和思路,写了代码;
思路我就不写了,就是动态规划的思路,先保证局部最优,再慢慢向全局部最优;
#include <iostream>
#include <cstring>
#include <malloc.h>
#include <algorithm>
using namespace std;
const int M=100;
int coinSum[M];
int coinValue[M];
void FindMin(int coin[], int money){
int i,j,k,temp,min,flag;
memset(coinSum, 999, sizeof(int)*M);
coinSum[0] = 0;
for(i=1; i<=money; i++)
{
min = 999;
for(j=0; j<5; j++ )
{
temp = i-coin[j];
if(temp<0) break;
if(min > coinSum[temp]+1){
min = coinSum[temp]+1;
flag = coin[j];
}
}
coinValue[i] = flag;
coinSum[i] = min;
}
printf("coin Sum = %d\n",coinSum[money]);
int n = coinSum[money];
printf("coin value = ");
while(n--){ //这野输出硬币,我用一个小技巧,由于coinValue中存的是新加的硬币
//,用当前钱减去硬币值 的 值 ,然后输出这个值的coinvalue,依次类推;
printf("%4d ",temp = coinValue[money]);
money = money-temp;
}
}
int main(){
int coin[5] = {1,2,5,9,10};
int money = 18;
FindMin(coin, money);
return 0;
}