当前位置: 首页 > wzjs >正文

石家庄市住房和城乡建设厅网站电子商务网站建设李洪心课后答案

石家庄市住房和城乡建设厅网站,电子商务网站建设李洪心课后答案,网站建设需要资质,wordpress用多大的带宽目录 一、01背包问题 1. 问题描述 2. 代码 (1)朴素做法——使用二维数组f (2)优化空间做法——将二维数组f降维成一维数组 二、完全背包问题 1. 问题描述 2. 代码 (1)朴素做法——使用二维数组f …

目录

一、01背包问题

1. 问题描述

2. 代码

(1)朴素做法——使用二维数组f

(2)优化空间做法——将二维数组f降维成一维数组

二、完全背包问题

1. 问题描述 

2. 代码

(1)朴素做法——使用二维数组f

(2)优化空间做法——将二维数组f降维成一维数组

三、多重背包问题

1. 问题描述

2. 代码

(1)朴素做法

(2)使用二进制优化的做法


一、01背包问题

1. 问题描述

有i种物品,背包容量为j,每种物品放背包放入0件或1件

2. 代码

(1)朴素做法——使用二维数组f

状态表示:用二维数组f表示状态;状态转移:不断更新状态,也就是不断更新数组f

#include <iostream>
using namespace std;const int N = 1000 + 10;// f[i][j]代表前i个物品在容量为j的背包中的最大价值; f[2][3]=4代表前两个物品在容量为3的背包中的最大价值为4
// w[i]代表第i个物品的体积; w[1]=1代表第1个物品的体积为1
// c[i]代表第i个物品的价值; c[1]=2代表第1个物品的价值为2
int f[N][N], w[N], c[N];int main()
{// 4个物品,背包体积为5int n, m;cin >> n >> m;for (int i = 1; i <= n; i ++ ){int a, b;cin >> a >> b;w[i] = a, c[i] = b;}// 物品ifor (int i = 1; i <= n; i ++ ){// 容量jfor (int j = 1; j <= m; j ++ ){// 如果物品i的体积大于容量j,物品i不放进背包if (w[i] > j) f[i][j] = f[i - 1][j];// 如果物品i的体积小于容量j,考虑是否将物品i放入背包,判断放入背包和不放入背包哪个价值更大else f[i][j] = max(f[i - 1][j - w[i]] + c[i], f[i - 1][j]);}}// 输出前4个物品在容量为5的背包中的最大价值cout << f[n][m] << endl;return 0;
}
(2)优化空间做法——将二维数组f降维成一维数组

第一步:把f数组的第一维全部删去;第二步:将内层循环变为逆序,j从m循环到w[i],保证j-w[i]大于等于0;第三步: 将f[j]=f[j]等多余部分去掉

// 物品i,容量j
for (int i = 1; i <= n; i ++ )for (int j = m; j >= w[i]; j -- )f[j] = max(f[j - w[i]] + c[i], f[j]);

二、完全背包问题

1. 问题描述 

有i种物品,背包容量为j,每种物品可以有无限件,每种物品可以往背包中放入0件,1件,2件.....,n件

2. 代码

(1)朴素做法——使用二维数组f
#include <iostream>
using namespace std;const int N = 1000 + 10;// f[i][j]代表前i件物品在容量为j的背包中的最大价值
int f[N][N], w[N], c[N];int main()
{// 4种物品,背包容积是5int n, m;cin >> n >> m;for (int i = 1; i <= n; i ++ ){int a, b;cin >> a >> b;w[i] = a, c[i] = b;}// 物品i(第i种物品)for (int i = 1; i <= n; i ++ ){// 容量jfor (int j = 1; j <= m; j ++ ){// 如果物品i的体积大于背包容量j,物品i不能放入背包if (w[i] > j) f[i][j] = f[i - 1][j];// 如果物品i的体积小于背包容量j,考虑是否物品i放入背包,判断放入背包和不放入背包的最大价值哪个更大else f[i][j] = max(f[i][j - w[i]] + c[i], f[i - 1][j]);}}// 输出前4种物品在容量为5的背包中的最大价值cout << f[n][m] << endl;return 0;
}
(2)优化空间做法——将二维数组f降维成一维数组

第一步:把f数组的第一维全部删去;第二步:调整j的范围,j从w[i]开始循环,保证j-w[i]大于等于0;第三步:将f[j]=f[j]等多余部分删去。和01背包的唯一不同点就是j是正序。

// 物品i(第i种物品),容量j
for (int i = 1; i <= n; i ++ )for (int j = w[i]; j <= m; j ++ )f[j] = max(f[j - w[i]] + c[i], f[j]);

三、多重背包问题

1. 问题描述

有i种物品,背包容积为j,每种物品有s件,可以往背包中放0,1,... ,s件物品i——>这是01背包问题的变形,01背包问题是i种物品,每种1件,可以往背包中放0或1件。

2. 代码

(1)朴素做法

步骤:第一步:写出01背包问题的优化空间的板子,写的时候记得多层物品i的数量k的for循环,注意k从0开始到s[i]。第二步:w[i]和v[i]前乘k。第三步:改k的判定条件。

#include <iostream>
using namespace std;const int N = 100 + 10;int f[N], w[N], v[N], s[N];int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i ++ ){int a, b, c;cin >> a >> b >> c;w[i] = a, v[i] = b, s[i] = c;}// 物品i,容量j,物品i的数量kfor (int i = 1; i <= n; i ++ )for (int j = m; j >= w[i]; j -- )for (int k = 0; k <= s[i] && k * w[i] <= j; k ++ )f[j] = max(f[j - k * w[i]] + k * v[i], f[j]);cout << f[m] << endl; return 0;
}
(2)使用二进制优化的做法——先拆分,再写01模板的板子

拆分——将每种物品的数量按照2的k次方进行拆分:比如第1种物品的体积为1价值为2数量为8,那么就可以就可以将数量8拆分成1,2,4,1; 对于1:体积1,价值2;对于2:体积2,价值4;对于4:体积4,价值8;对于1:体积1,价值2。   

#include <iostream>
using namespace std;const int N = 2010, M = 11010;// f[j]中的j代表背包容积,根据题意得j最大为2000
// ww[i]代表第i种物品的体积; vv[i]代表第i种物品的价值; cnt记录有多少种物品,最多有1000logSi种物品,这道题就是1000log2000向上取整再加十为11010
int f[N], ww[M], vv[M], cnt;int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i ++ ){// 第i种物品的体积,价值,数量int a, b, s;cin >> a >> b >> s;// 拆分第i种物品的数量-->将一种物品拆分成多种物品for (int j = 1; j <= s; j <<= 1){ww[ ++ cnt] = j * a, vv[cnt] = j * b;s -= j;}// 如果数量s有剩余,记录下最后一种物品if (s) ww[ ++ cnt] = s * a, vv[cnt] = s * b;}// 01背包模板; 物品i,容量j; 注意拆分过后有cnt种物品for (int i = 1; i <= cnt; i ++ )for (int j = m; j >= ww[i]; j -- )f[j] = max(f[j - ww[i]] + vv[i], f[j]);cout << f[m] << endl;return 0;
}

http://www.dtcms.com/wzjs/571498.html

相关文章:

  • 成立一个做网站的工作室网页制作与网站建设》在线作业 答案
  • 星月教你做网站学习网站建设有前景没
  • 网站后台用什么语言怎么举报app软件
  • 设置 wap网站公司注册app流程下载
  • 网站建设流程文字稿门户网站构建
  • 姑苏网站建设手机电商网站开发
  • wordpress sae svn放心网站推广优化咨询
  • 北京网站优化服务商济南建网站市场
  • 有什么可以做建筑模型的网站岳阳博物馆网站
  • 运河网站制作提供网站建设出售
  • 统计局门户网站建设目标app软件开发公司排行
  • 南宁建站服务建设银行忘记密码网站首页
  • 平面设计高端网站哪个网站做的简历比较好
  • 做网站中网页的大小建视频网站需要多大空间
  • 制作网站软件不懂代码可以制作吗南通小程序制作
  • 网架制作厂云南网络推广seo代理公司
  • 网页设计制作网站论文扬州高端网站建设
  • 提供手机网站建设推荐国内精自品线一区91制片
  • 沈阳网站建设那家好哪个网站做飞机订单
  • 重庆网站优化指导php手机网站开发工具
  • 网站建设设计策划移动电商网站设计
  • 营销型网站建设多少钱域名 做网站和邮箱
  • 网站域名如何续费删负面的网站
  • 流行网站类型北京医院网站建设
  • 兰州微信信息平台网站建设自己设计好的网站怎么设置访问
  • m开头的手机网站怎么做wordpress菜单如何做
  • 网站logo怎么做动态上外国网站用什么dns
  • 搜索引擎对网站推广的作用缪斯设计上海
  • 怎样接做网站的活创建网站要钱吗
  • 做旅游网站需要的背景用wordpress建站难吗