动态规划中的背包问题思路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
背包问题思路
一个容量的空间(是有限的),并且有多种选择进行存放到这个空间中的实体,要你编程解决,在这些实体中选择一些最有价值的实体进行存放,使得最后存放的结果最优。这种思路就是动态规划中背包问题
我们操作方法是:首先把容量进行细划到最小的单位,一般是整数1.每个单位在这里都充当的一个容量。每个容量在每次存放实体时都要进行最优化。最后需要输出的结果一般在最后一行,大多数在最后一个a[n][m]里面。
[问题描述]
在M件物品取出若干件放在空间为W的背包里,每件物品的重量为W1,W·2……Wn,与之相对应的价值为P1,P2……Pn。求出获得最大价值的方案。
注意:在本题中,所有的重量值均为整数。
可以看出如果通过第N次选择得到的是一个最优解的话,那么第N-1次选择的结果一定也是一个最优解。这符合动态规划中最优子问题的性质。
考虑用动态规划的方法来解决,这里的:
阶段是:在前N件物品中,选取若干件物品放入背包中;
状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值;
决策是:第N件物品放或者不放;
由此可以写出动态转移方程:
我们用f[i,j]表示在前i 件物品中选择若干件放在所剩空间为j 的背包里所能获得的最大价值
f[i,j]=max{f[i-1,j-Wi]+Pi (j>=Wi), f[i-1,j]}
这样,我们可以自底向上地得出在前M件物品中取出若干件放进背包能获得的最大价值,也就是f[m,w] 算法设计如下:
for(i=1;i<=m;i++) /*m是物品的个数*/
for(j=0;j<=n;j++) /*n是背包容量*/
{
f[i][j]=f[i-1][j];
if(j>=v[i])
{
x=f[i-1][j-v[i]]+p[i];
if(x>f[i][j])
f[i][j]=x;
}
}
采药
(medic.pas/c/cpp)
【问题描述】
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
【输入文件】
输入文件medic.in的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
【输出文件】
输出文件medic.out包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
【样例输入】
70 3
A[100][3] int f[100][100]={0}
71 100
69 1
1 2
F[i][0]=0; f[0][j]=0
f[i][j]=max{f[i-1][j],f[i-1][j-a[i][1]]+a[i][2]} j>=a[i][1] j 【样例输出】 3 1、首先初始化f数组,全变成0 2、当j>=物品重量时,f[i][j]=max{f[i-1][j],f[i-1][j-a[i][1]]+a[i][2]} A[i][1]是物品的重量,a[i][2]是物品的价值