DP(1)

来源:互联网 发布:切糕事件知乎 编辑:程序博客网 时间:2024/06/04 22:18

动态规划:从新手到专家

凑硬币

状态

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算法还有些类似。

0 0