- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9动态规划(02背包问题)解析,背包问题动态规划,01背包问题动态规划,完全背包问题动态规划,01背包问题动态规划c,动态规划求解背包问题,动态规划之01背包问题,动态规划二维背包问题,背包问题动态规划c,动态规划0—1背包问题
9动态规划(背包问题)
9.2.4背包问题
有n件物品,每件物品有一个重量和一个价值,同时有一个背包容量为wk,要求从n件物品中任取若干件,使重量之和=wk,而价值之和最大。
五种不同类型背包
0—1背包 ,n件物品,每件物品要么不取,或者全取
可拆背包,每件物品可以拆开,任意选取
无限背包,每件物品有无穷多个
多重背包,每件物品有许多个,但是不是无穷。
关联背包,有些物品不能独立,必须和别的物品一道选取
0—1背包
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v- w[i]]+ c[i]}
例如 n=6 , wk=30
重量 w 5 13 7 10 8 14
价值 C 16 28 18 20 17 31
数组w[i]第i件物品的重量
数组c[i]第i件物品的价值
数组g[i][j] 表示前i件物品恰放入一个容量为j的背包可以获得的最大价值。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 2 0 0 0 0 0 16 16 16 16 16 16 16 16 28 28 28 28 28 44 44 44 44 44 44 44 44 44 44 44 44 44 3 0 0 0 0 0 16 16 18 18 18 18 18 34 34 34 34 34 34 44 44 46 46 46 46 46 62 62 62 62 62 62 4 0 0 0 0 0 16 16 18 18 18 20 20 34 34 34 36 36 38 44 44 46 46 54 54 54 62 62 62 64 64 66 5 0 0 0 0 0 16 16 18 18 18 20 20 34 34 34 36 36 38 44 44 51 51 54 54 54 62 62 62 64 64 71 6 0 0 0 0 0 16 16 18 18 18 20 20 34 34 34 36 36 38 44 47 51 51 54 54 54 62 65 65 65 67 71
递推关系
参考代码:
#include iostream
#include cstdio
#include algorithm
using namespace std;
#define MAXN 1010
int c[MAXN],w[MAXN],g[MAXN][MAXN];
int main(){
int n,wk,i,j;
cinnwk;
for(i=1;i=n;i++)cinw[i]c[i];
for(j=0;j=wk;j++)g[0][j]=0;
for(i=1;i=n;i++)
for(j=0;j=wk;j++){
if(w[i]j) g[i][j]=g[i-1][j];
else g[i][j]=max(g[i-1][j],g[i-1][j-w[i]]+c[i]);
}
coutg[n][wk];
return 0;
}
优化一:观察G[i][j]可以发现,第i行只与i-1行进行比较,可以节约空间,防止数据量过大,不使用二维数组。
#include iostream
#include cstdio
#include algorithm
using namespace std;
#define MAXN 1010
int c[MAXN],w[MAXN],g[1][MAXN];
int main(){
int n,wk,i,j;
cinnwk;
for(i=1;i=n;i++)cinw[i]c[i];
for(j=0;j=wk;j++)g[0][j]=0;
for(i=1;i=n;i++){
for(j=w[i];j=wk;j++)g[1][j]=max(g[0][j],g[0][j-w[i]]+c[i]);
for(j=0;j=wk;j++)g[0][j]=g[1][j];
}
coutg[
文档评论(0)