算法分析题
货币找零问题
(1)证明最优性原理
我们想采用动态规划方法解决此类问题,就必须证明其最优性原理成立。 所谓最优性原理,就是指无论过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优决策序列。
举个例子来说明什么是初始状态,什么是初始决策,什么是初始决策所导致的初始状态。
假设
s
,
v
1
,
v
2
,
.
.
.
,
v
k
−
1
,
t
s,v_1,v_2,...,v_k-1,t
s,v1,v2,...,vk−1,t 是一条由s到t的最短路径,初始状态为s,已经做出了从
s
−
v
1
s-v_1
s−v1的初始决策,因此
v
1
v_1
v1就是初始决策所产生的状态。因此后面的决策必须相对于
v
1
v_1
v1构成一个最优决策序列。因此该例子满足最优性原理。
归纳证明最优性原理的办法
STEP 1: 设最优决策序列的形式
STEP 2: 明确初始状态和初始决策,确定初始决策所产生的状态
a
a
a。
STEP 3: 证明在最优决策序列中,状态
a
a
a后面的其余决策相对于状态a一定是最优决策序列。
(2) 写出递推关系式
本题我们假设货币面额有1,2,4,5,10,给出金额n。求出最少的货币数量
// 递推关系式
vector<int>v={1,2,4,5,10}; //存取货币系统
int a[n]; // a[i]表示金额为i时最少需要多少货币
if i-v[j] > 0
a[i]=min{a[i],a[i-v[j]]+1};//
货币找零问题中的贪心与动态规划
什么样的情况可以用贪心做?什么样的情况必须采用动态规划?
对于一个货币系统
d
1
,
d
2
,
d
3
.
.
.
.
d
m
d_1,d_2,d_3....d_m
d1,d2,d3....dm ,如果前n-1项的和都不超过第n项的值,则符合贪心规则。如果前n-1项之和不在总小于第n项,此时贪心不在成立,必须采用动态规划的递推关系式进行求解。例如:对于货币系统1,2,4,5,10,8元如果用贪心查找,每次都选最大的,那我们找不到解,而实际上可以用两张4元就可以解决。