动态规划和分治策略相似,不同的是,它针对的问题所分解出的小问题数量很多且很多是重复的。动态规划就是使得这些重复的小问题只需要计算一次,避免重复计算。
钢条切割问题:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,...,n)求切割钢条方案,使得销售收益rn最大。
钢条切割问题:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,...,n)求切割钢条方案,使得销售收益rn最大。
注意,如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割(具体问题描述见算法导论第三版第15章),以下都是用C语言实现,伪代码参考算法导论。
第一次尝试:自顶向下的递归算法
<span style="font-size:18px;">#include <stdio.h>
#include "limits.h"
#define INT_MIN (-INT_MAX - 1)
int CutRod(int *p,int n);
void main()
{
int p[]={0,1,5,8,9,10,17,17,20,24,30};
printf("%d\n",CutRod(p,10));
}
int CutRod(int *p,int n)
{
if(n==0)
return 0;
int q=INT_MIN;
for (int i=0;i<n;i++)
{
int tmp=CutRod(p,n-1-i)+p[i];
q=(q>tmp?q