用动态规划法求解简单的0-1背包问题 oj题目P1208 采药

题目描述

用动态规划法求解简单的0-1背包问题 oj题目P1208 采药_第1张图片

用动态规划法求解简单的0-1背包问题 oj题目P1208 采药_第2张图片 

 算法设计与分析

这题是典型的可以用动态规划来求解的问题,假设总共有n株草药,这题就是想要让我们求\sum xi*vi,1<=i<=n,其中xi的值不是0就是1表示选择摘或者不摘第i株草药,摘第i株草药的话,xi=1,否则xi=0;而vi表示的是第i株草药的价值;那么这题就是为x1,x2.......xn,赋予一组值使得\sum xi*vi最大,暂时把为x1,x2.......xn赋予一组值得过程称作一个决策;那么构造dp数组,dp[i][j]得值表示,当剩余采摘草药得时间还有j时,已经为x1,x2......xi做了一个决策,即前i株草药已经决策好哪些采摘那些不采摘,且这个决策使得\sum xi*vi最大,那么最终dp数组中最后一个数组元素得值就是我们需要求得值

程序源代码以及运行结果截图

//采药,用动态规划的思路来解,对于每一株草药要么采摘,要么不采摘,看看采摘和不采摘哪一个的哪一个是最优的选择,构造dp数组,对于0-1背包的问题用贪心算法求解不出来

#define _CRT_SECURE_NO_WARNINGS
#include
#define M 100
#define T 1000

//此题用动态规划的方法来解,构造的dp数组的含义是,dp[i][j]表示当时间容量剩余j时对于前i个物品采摘决策所得到的最优的解
int max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}
int dp[M + 2][T + 2];           //辅助数组,用于求解dp问题

int vdp[M + 2][T + 2];         //用于存放背包剩余体积的数组


int main()
{
	int t;    //表示可以进行采草药的总的时间
	int m;   //表示山洞里的草药的总的数目

	int time[M];
	int value[M];
	
	while (scanf("%d%d",&t,&m) != EOF)
	{
		for (int i = 0; i < m; i++)
		{
			scanf("%d%d", &time[i], &value[i]);
		}
		for (int i = 1; i <= m; i++)
		{
			for (int j = 1; j <= t; j++)
			{
				
				//还要记录以下放进背包的东西容量是否超了没有,你这种做法相当于假定背包容量无限

				if (j < time[i - 1])
				{
					dp[i][j] = dp[i - 1][j];
				}
				else
				{
					dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - time[i - 1]] + value[i - 1]);      //对于一株草药选择采摘和不采摘时看哪一种价值会更大
				}
				
				
			}
		}
		printf("%d\n", dp[m][t]);
	}
	return 0;


}

运行结果截图用动态规划法求解简单的0-1背包问题 oj题目P1208 采药_第3张图片

 这题其实不是很难,会记录是因为我以前遇到过一样的题,那题我用贪心思路去解,好巧不巧的是oj上面给的测试用例刚好让我用贪心得思路得到了正确得结果,但是对于0-1背包问题用贪心思路是解不出来得,贪心思路得到的结果也不一定是最优得结果,因为贪心策略总是做出对当前来说最好的选择,也就是求每一个的局部最优解,但是这些局部最优解合起来是不是全局最优解这是不一定的,所以贪心算法需要证明其正确性,要部分背包问题才可以用贪心得策略来做,在上算法课的时候老师讲0-1背包问题的解法时也只讲了回溯法,分支界限法,以及动态规划法,但是当时做题目的时候用贪心法碰巧在某些测试用例上得出了正确结果就以为0-1背包问题可以用贪心策略来解,这算是记录一下初学算法时的一些坑吧,我觉得收获还挺大的,分享给你们,下面是我用贪心算法解0-1背包的例子http://t.csdn.cn/mYmTy,感兴趣的可以去看一下,这篇博文用错误的算法思路得到了正确的结果,像本题用我上面这篇博文的贪心思路就得不出正确结果,所谓正确的结果是指在oj上面运行通过了,但是能通过应该只是因为oj给的测试用例很凑巧让我通过了不代表我的算法思路正确,事实上我的算法思路不正确,这篇博文是对它的一个更正;

祝学习进步,生活愉快!

你可能感兴趣的:(OJ题目,动态规划,算法,c语言,贪心算法,程序人生)