动态规划中的背包问题思路

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]是物品的价值

3、当j

【数据规模】

对于30%的数据,M <= 10;

对于全部的数据,M <= 100。

动态规划:记f(t, m)是如果只采前m株草药,在时间t里能够得到的最大价值。可以得到

f(t, m) = max{f(t, m – 1), f(t –采第m株草药需要的时间, m – 1) + 第m株草药的价值} 时间复杂度O(T * M)。

2.开心的金明

(happy.pas/c/cpp)

【问题描述】

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,j k,则所求的总和为:

v[j1]*w[j1]+v[j2]*w[j2]+ …+v[j k]*w[j k]。(其中*为乘号)

请你帮助金明设计一个满足要求的购物单。

【输入文件】

输入文件happy.in 的第1行,为两个正整数,用一个空格隔开:

N m

(其中N(<30000)表示总钱数,m(<25)为希望购买物品的个数。)

从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有2个非负整数

v p

相关文档
最新文档