ACM动态规划-1

动态规划解题心得
动态规划解题实质是一种多阶段分析的思想,通过决策的每一步都是最优解以保证是全局最优解。使用动态规划解题时,首先要判断该题是否适合动态规划的思想。因此符合动态规划问题一般有一下基本特征
1、问题具有多阶段决策的特征,是否具有最优子结构性质;
2、每一个阶段都有相应的状态变量与之对应;
3、每一阶段都要做出决策,求出局部最优决策;
4、每一个局部最优解影响下一步最优解的判断;
5、各个子问题与原问题有相同的结构。判断出若符合动态规划则使用动态规划解题,一般步骤为:
1、分阶段把问题分成若干子问题;
2、建立状态转移方程(递推公式);
3、找出边界条件;
4、将已知值带入方程,递推求解。下面是一个动态规划的例题:急!灾区的食物依然短缺!
为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,
现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。
请问:你用有限的资金最多能采购多少公斤粮食呢?
首先,这个题用动态规划将不同的大米存入数组中,第一此次减循环求出不同的金币能买的最多的第一种大米,求出最大值,第二次遍历判断同样的金币能买的第二种大米的重量和第一种大米的重量,记录下最大值,一次地推,最后遍历到第m种大米时可以得出用这n元钱能买的m种大米的最大重量。该题就是依次遍历,每次得出最优解局部,将最优解保存下来,之后每次遍历都与前次最优解做比较,直到遍历结束得出全局最优解。

#include<stdio.h>
#include<string.h>

inline int max(int a,int b){return a>b?a:b;}

int main(){
int i,j,k,m,n,T,maxu;
int u[110],v[110],w[110],dp[110];
scanf(“%d”,&T);
while(T –)
{
maxu=0;
scanf(“%d%d”,&n,&m);
for(i=1;i<=m;i++)
scanf(“%d%d%d”,&u[i],&v[i],&w[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++){
for(j=n;j>=u[i];j–){
for(k=1;k<=w[i];k++)
if(j>=ku[i]
dp[j]=max(dp[j],dp[j-k
u[i]]+v[i]*k);
maxu=max(maxu,dp[j]);
}
}
printf(“%d\n”,maxu);
return 0;
}

做这类题时最重要的就是找出状态转移方程,这是解题的关键。

点赞