本周学习了动态规划,学习动态规划后,感觉和贪心是有些类似的,但中心思想并不同,贪心是从局部去考虑,而动态规划是从整体去考虑,各有千秋。 贪心算法:每一步都是当前状态的最优解,特点就是鼠目寸光,每个阶段的最优状态都是由上一状态的最右状态得到。 动态规划:动态规划是从整体去考虑问题,每个阶段的最优状态可以由之前的某些状态直接得到。 动态规划解题步骤: 1、判断问题是否具有最优子结构性质,若不具备则不能用动态规划。 2、把问题分成若干个子问题(分阶段)。 3、建立状态转移方程(递推公式)。 4、找出边界条件。 5、将已知边界值带入方程。 6、递推求解。 思想: 在做每一步决策时,列出各种可能的局部解。依据某种判定条件,舍弃那些肯定不能得到最优解的局部解。以每一步都是最优的来保证全局是最优的。 这几天我也做了几道题目,但是比较尴尬,我都没有用到动态规划,没有很好的理解。例如下面这题 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买道具!" 地精商人:"我们这里有三种道具,血瓶150块一个,魔法药200块一个,无敌药水350块一个." 死亡骑士:"好的,给我一个血瓶." 说完他掏出那张N元的大钞递给地精商人. 地精商人:"我忘了提醒你了,我们这里没有找客人钱的习惯的,多的钱我们都当小费收了的,嘿嘿." 死亡骑士:"......" 死亡骑士想,与其把钱当小费送个他还不如自己多买一点道具,反正以后都要买的,早点买了放在家里也好,但是要尽量少让他赚小费. 现在死亡骑士希望你能帮他计算一下,最少他要给地精商人多少小费. Input 输入数据的第一行是一个整数T(1<=T<=100),代表测试数据的数量.然后是T行测试数据,每个测试数据只包含一个正整数N(1<=N<=10000),N代表死亡骑士手中钞票的面值. 注意:地精商店只有题中描述的三种道具. Output 对于每组测试数据,请你输出死亡骑士最少要浪费多少钱给地精商人作为小费. Sample Input 2 900 250 Sample Output 0 50 当时看到这道题实在是想不通怎么用动态规划,还是掌握的不够熟练,但是仔细观察后发现,350等于200加上150,200又等于150加上50,所以当时我就想可以假设全买150的,看剩下的钱还够几个50的,即200的,这地方还要分下类。代码去下。 #include<iostream> using namespace std; int main() { int t,m,x,y,s,p; cin>>t; while(t--) { cin>>m; x=m/150; s=m-150*x; y=s/50; if(y<x) p=m-(150*x)-(y*50); else p=m-(200*x); cout<<p<<endl; } } 这地方的确有些取巧的意思,换几个数据就不能这样做了。这周还会努力刷题的。