凑硬币
状态
d(i)表示凑够i元需要的最少硬币数量
状态方程
d(i)=min{ d(i- vj )+1 },其中i- vj >=0, vj 表示第j个硬币的面值
#define INF 10000;
int Min[100];
int coins[] = { 1,3,5 };
void find_coins(int value)
{
//初始化
for (int i = 1; i <= value; i++)
Min[i] = INF;
//d(i)=min{d(i-V_j)+1} i-V_j>=0, V_j表示第j个硬币的面值
for (int i = 1; i <= value; i++)
for (int j = 0; j < 3; j++)
if (coins[j] <= i && Min[i - coins[j]] + 1 < Min[i])
Min[i] = Min[i - coins[j]] + 1;
//output
cout << Min[value] << endl;
}
int main()
{
int value;
while (cin >> value)
find_coins(value);
system("pause");
return 0;
}
后记
d(i)表示状态,但下标i不自觉的让人联系到循环体下标i。
我觉得这算一个坑吧。
考虑DP,出发点就是状态,状态方程在状态间跳转。
跟有限状态机一样。
这样来看,跟KMP算法还有些类似。