您的位置:首页 > 其它

找零问题_动态规划

2012-06-04 23:38 169 查看
// 找零问题_动态规划.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include<iostream>
#include<stdlib.h>
using namespace std ;

void MinCoin(int NumOfValue , int Money  , int *CoinValue , int *OutCoin);

/*
*    假如面值为{1,2,5}的钱币, 现在需要需要找得钱为18元,求所需要找钱最少的张数
*    NumOfValue : 3
*    Money      : 18
*    CoinValue  : {1,2,5}
*    OutCoin    : [1-18] 表示 1-18中需要找的钱的最少值
*                 譬如 OutCoin[7] 表示要找7元时所需要的最少张数
*                      OutCoin[8] 表示要找8元时所需要的最少张数
*
*/

void MinCoin(int NumOfValue , int Money  , int *CoinValue, int *OutCoin)
{
/*
* 因为动态规划需要从之前的状态推导当前的状态
* 所以必须先初始化之前的状态 OutCoin[0]
*/
OutCoin[0] = 0;

//从1元开始,算出1,2,3....Money中每一个需要找得钱数所对应的最少张数
for (int curMoney=1; curMoney<=Money; ++curMoney)
{
// 目的是要求出在当前的curMoney的情况下,所需要找得最少钱数 -> OutCoin[curMoney] = MinCoin
int MIN = curMoney;

/*
* 轮询每一个币值,
* 找出当前的钱数减去硬币面值,所得出之前的OutCoin的最小值
* 然后+1,就是当前钱数所需找得最少值
*
* 譬如说现在curMoney:9, 已经得出了OutCoin[8] = X, OutCoin[7] = Y, OutCoin[4] = Z
* 现在就要比较 X, Y, Z的最小值 Mini
* 结果就是 Mini + 1;
*/
for (int ValueIdx = 0; ValueIdx < NumOfValue; ++ValueIdx)
{
if (curMoney - CoinValue[ValueIdx] >= 0)
{
//求出OutCoin[MoneyId-ValueIdx]所找得最少张数
if (OutCoin[curMoney-CoinValue[ValueIdx]] < MIN)
{
MIN = OutCoin[curMoney-CoinValue[ValueIdx]];
}
}
}
OutCoin[curMoney] = MIN+1;
}
}

int main()
{
int a[]={1, 2 , 5} ;
int c[18+1]={0} ;

MinCoin(3 , 18 , a , c) ;
cout << "最优解就是最少值为:" << c[18] << endl ;
for(int i=1 ; i<19 ; i++)
cout << c[i] << " " ;
system("pause") ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: