修改于2016年5月8日 10:45,尽量让代码都有自己的习惯
刚接触动态规划的时候感觉很高端,但是做了以后啊还是那么大点事,也许什么事都那么回事,做了才知道,只有自己才清楚。其实在这个11硬币里面最主要的还是状态转移方程,只要这个方程找对了,实现起来也很容易,当进行到当前这一步,我总要和前一步进行比较,看这步是不是优化了,下面的外层循环遍历1,3,5,这个面值,然后里面在进行判断比较,这才是最关键的一步。很多问题类似,像背包问题。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int i = 0;
int j = 0;
int *d = NULL; // 记录多少分的硬币需要的多少个
const int sum = 11;
int value[3] = {1,3,5};//硬币的面值
d = (int *)malloc(sizeof(int) * (sum + 1));
memset(d,0x00,sizeof(int)*(sum + 1));
for(i = 0; i <= sum; i++){
d[i] = i; // 初始状态 只用一分硬币
}//end for
for(i = 0; i < 3; i++){
for(j = 0; j <= sum; j++){
if(j >= value[i] && d[j] > d[j - value[i]]){//可以放下当前的硬币,并且用的面值比以前少
d[j] = d[j - value[i]] + 1; // 状态转移方程的核心一步
}//end if
}//end for 2
}//end for 1
for(i = 0; i <= sum; i++){
printf("%d ",d[i]);
}//end for
return 0;
}
结果如图所示,这是11分硬币的换的做少的解。
今天中午真的很不爽,都没睡着,到底要以怎么的方式进行下去,我真的不知道了,本来想不通的问题我是不会去想的,不想因此而影响我的心情,就星期天的晚上,我不知道自己的感觉有没有错, 如果,,我发现 ,你对我说过的话,出尔反尔,我绝对就不理你,得不到就放弃吧,为什么还要拼命的争取,那样只会让自己伤痕累累,我也许是站在理性的角度,我会拿的起,放得下的,剩下的就看你,,