Dynamic Programing, DP.
通过下面这个问题来了解一下DP基础
有n种面值的硬币,其面值分别为(V1, V2, V3,...,Vn),求组合出价值为S的方法,且消耗硬币数量最少,或者说明不能组合出S。
下面是解决DP问题的过程:
找到一个状态S,状态S下已有最优解,在状态S的帮助下,我们可以找到下一个状态的最优解。
状态S的上一个状态为i =S-vj (vj<S),只要找到达到状态i所需的最少硬币数+1,就是达到状态S所需的最少硬币数,其中加一是因为需要消耗一枚面值为vj的硬币。
举个具体的例子来更好的帮助我们理解这个问题
现有面值分别为1、3和5的3种硬币,求组合出总值为S=11的解(只需给出最少的硬币个数)。
v=[v1, v2, v3]=[1, 3, 5], S=11
State 0:也就是S=0,组合出总价值为0的解是0,即用0个面值为0的硬币组合出总价值为0的情况。
State 1: 当前S=1还没有解,小于或等于S=1的币种只有v1=1,所以现在问题变为State S-v1=0,已有解。所以,S=1的解应为1 = v1 + 0 = 1 + 0,需要1枚面值为1的硬币
State 2: S=2,小于或等于2的币种只有v1=1的币种,所以问题同样变为State S-v1=1,State 1已经有解。所以,S=2的解应为2 = v1 + State 1的解,需要2枚面值为1的硬币
State 3: S=3, 小于或等于3的币种有v1=1和v2=3两种,所以问题变为State S-v1 = 2,或者State S-v2 = 0。State 2的解需要2枚硬币,State 0的解需要0枚硬币,所以State 3的状态应该变为v3 + State 0,即需要1枚面值为3的硬币
State 4: S=4,小于或等于4的币种有v1=1和v2=3两种,问题可变为State S-v1= 3,或者State S-v2=1,State 3和State 1都需要1枚硬币,所以State 4存在两种转换方式,State 4=v1 + State 3或者State 4=v2 + State 1均可,需要2枚硬币
State 5: S=5,小于或等于5的币种有v1=1、v2=3和v3=5三种,问题可变为State S-v1,State S-v2和State S-v3,即State 4、State 2和State 0,State 4需要2枚硬币,State 2需要2枚硬币,State 0需要0枚硬币,所以State 5 = v3 + State 0,需要1枚面值为5的硬币
State 6: S=6,问题转换为State 5, State 3和State 1,需要2枚硬币
State 7: S=7,问题转换为State 6, State 4和State 2,需要3枚硬币
State 8: S=8,问题转换为State 7, State 5和State 3,需要2枚硬币
State 9: S=9,问题转换为State 8, State 6和State 4,需要3枚硬币
State 10: S=10,问题转换为State 9, State 7和State 5,需要2枚硬币
State 11: S=11,问题转换为State 10, State 8和State 6,需要2枚硬币
如果我们回溯一下某个状态的转移过程,可以得到某个具体的和S是由什么硬币组成的。例如,对于S=11,由1+10转移而来,10由5+5转移而来,故11由1+5+5组成。