9动态规划(02背包问题)解析.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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)

441113422 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档