您的位置:首页 > 其它

DP(1)

2016-03-15 16:52 232 查看
动态规划:从新手到专家

凑硬币

状态

d(i)表示凑够i元需要的最少硬币数量

状态方程

d(i)=min{ d(i-vjv_j)+1 },其中i-vjv_j>=0,vjv_j表示第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算法还有些类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: