就是用拆分物品的方法做的多重背包啦,时间复杂度为O(V∑logN[i]),空间复杂度为O(V)。由于是拆分物品,所以保存路径时不但要记录转移前的位置,还要记录当前硬币的类型以及使用的个数,输出前沿着路径找回去统计一下个数就好啦。一直WA不知所措,以为是算法问题一直找BUG,后来发现原来是一个quarters本来是25cents抄成了15cents。最后是自己带数据去测试才找到问题所在。写了这么多题觉得自己带数据找BUG才是王道= =。无论是交之前检查还是交之后WA回来找BUG都很不错。在比赛时尽量别太着急着去交代码吧,要拿出如果交上去WA了怎么办的心态去调试。尽量先检查几遍代码,实在找不到BUG或觉得应该不会错了就果断自己带一些数据再去搞一搞。
如果用完全背包的做法去做多重背包,就需要用到一个used数组,时间复杂度为O(V),空间复杂度为O(V)。
一共就4种物品所以当做N=4为常数了,否则正常的时间复杂度为:O(VN)。
参考1:http://blog.youkuaiyun.com/libin56842/article/details/9470687 拆分物品法
参考2:http://blog.youkuaiyun.com/liuqiyao_01/article/details/8936716 完全背包法
代码1:拆分物品法
#include<stdio.h>
#include<string.h>
using nam