动态规划采药问题

本文介绍了动态规划的概念,强调了其关键特征:最优子结构、状态转移方程、边界和重叠子问题。通过一个采集药草的例子,详细展示了如何运用动态规划解题,包括穷举分析、确定边界、找最优子结构和状态转移方程的建立。最终给出了C语言实现的代码示例。
摘要由CSDN通过智能技术生成

动态规划其实就是,给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后呢,把子问题答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法。

动态规划有几个典型特征,最优子结构、状态转移方程、边界、重叠子问题。

解题思路

1.穷举分析

2.确定边界

3.找规律,确定最优子结构

4.写出状态转移方程

1.穷举分析

   给定一个实例的输入:
   如:T = 10 M = 5

采集药草耗费的时间采集药草产生的价值
105
23
2011
86
75

   价值矩阵如下

012345678910
000000000000
100000000005
200333333335
300333333335
400333333669
500333335689


2.确定边界        

   时间等于0时候,药的数量为0的时候

3.确定最优子结构

   F(N) = F(i-1,N-TIME[i])+VALUE[i]

4.写出状态转移方程

   如果时间足够: Dp[i][j] = Max(Dp[i-1][j-TIME[i]]+VALUE[i],Dp[i-1][j]) 如果时间不够: Dp[i][j] =         Dp[i-1][j]

代码如下

#include<stdio.h>
#include<stdlib.h>
#define N 100
int dp[N][N];                          //初始化数组为0 
int drug[N][2];                        //定义药的数组 ,第一个为数量,第二个为存放采药的时间与价值
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}
int main()
{
	int time,num;
	int i,j;
	scanf("%d %d",&time,&num);
	for(i=1;i<=num;i++)
	{
		for(j=0;j<2;j++)
		{
			scanf("%d",&drug[i][j]);   //输入num个药需要采摘的时间与药的价值
			 
		}
	}
	for(i=1;i<=num;i++)
	{
		for(j=time;j>=0;j--)
		{
			if(j>=drug[i][0])
				dp[i][j]=max(dp[i-1][j-drug[i][0]]+drug[i][1],dp[i-1][j]);
			else
				dp[i][j]=dp[i-1][j];
		}
	}
	printf("%d",dp[num][time]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值